brick 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9cd49783dae6701760920fe007cbde7382fd3dbaf5e8f7472d475c0fe8aaf660
4
- data.tar.gz: d2330f28e87dde00b1377f6cbca31cbbfe2dd3b2c495f1fbd0aebc0f8a951504
3
+ metadata.gz: 634669de2074746d62642b8c9108070b78e92b14f7924ac969404b240de2267d
4
+ data.tar.gz: 7614fa456fcaeb6bc68227230088fe3adeed31278241a000f3fb19792b763d26
5
5
  SHA512:
6
- metadata.gz: 2a3c7ba47d32f3a6ab6c9be838006826f5266efb1349d90ce7d53b5e8f89ea078bdcb699a7db8084176e2de444a27931ce8e0216af666c25704c0568b59ac827
7
- data.tar.gz: 41fccf3387315cd54fd596955c3f07760941cd4aa51959dc99f87d0b6fb38de742ad11fe7dabb084a3e72167c340b8aafce838c7704626359ccb41878e202ae2
6
+ metadata.gz: 3b89ed9c8ffe3c63e098a3f7a8e5a9987db0c00bfe2c917b7c2acefebc30653a4a88d091852b8f8e6128daa310e7c7742d10611acfb0ffe7d06cc6c01da7068e
7
+ data.tar.gz: 98d58b4461b9e85537da640e3940316553d142a341547086ce614f75d9366145c8818beb6e972ac93a77e7209b034eb64a64eb9a078f6afb91fbbd008e3ade69
@@ -80,6 +80,18 @@ module ActiveRecord
80
80
  end
81
81
  end
82
82
  end
83
+
84
+ module Inheritance
85
+ module ClassMethods
86
+ private
87
+
88
+ alias _brick_find_sti_class find_sti_class
89
+ def find_sti_class(type_name)
90
+ ::Brick.sti_models[type_name] = { base: self } unless type_name.blank?
91
+ _brick_find_sti_class(type_name)
92
+ end
93
+ end
94
+ end
83
95
  end
84
96
 
85
97
  # Object.class_exec do
@@ -113,6 +125,11 @@ class Object
113
125
  singular_table_name = ActiveSupport::Inflector.underscore(model_name)
114
126
  table_name = ActiveSupport::Inflector.pluralize(singular_table_name)
115
127
 
128
+ # Adjust for STI if we know of a base model for the requested model name
129
+ if (base_model = ::Brick.sti_models[model_name]&.fetch(:base, nil))
130
+ table_name = base_model.table_name
131
+ end
132
+
116
133
  # Maybe, just maybe there's a database table that will satisfy this need
117
134
  if (matching = [table_name, singular_table_name, plural_class_name, model_name].find { |m| relations.key?(m) })
118
135
  build_model(model_name, singular_table_name, table_name, relations, matching)
@@ -138,8 +155,9 @@ class Object
138
155
  if table_name == singular_table_name && !ActiveSupport::Inflector.inflections.uncountable.include?(table_name)
139
156
  raise NameError.new("Class name for a model that references table \"#{matching}\" should be \"#{ActiveSupport::Inflector.singularize(model_name)}\".")
140
157
  end
141
- code = +"class #{model_name} < ActiveRecord::Base\n"
142
- built_model = Class.new(ActiveRecord::Base) do |new_model_class|
158
+ base_model = ::Brick.sti_models[model_name]&.fetch(:base, nil) || ActiveRecord::Base
159
+ code = +"class #{model_name} < #{base_model.name}\n"
160
+ built_model = Class.new(base_model) do |new_model_class|
143
161
  Object.const_set(model_name.to_sym, new_model_class)
144
162
  # Accommodate singular or camel-cased table names such as "order_detail" or "OrderDetails"
145
163
  code << " self.table_name = '#{self.table_name = matching}'\n" unless table_name == matching
@@ -66,7 +66,7 @@ module Brick
66
66
  associatives = hms.select { |k, v| v.options[:through] }.each_with_object({}) do |hmt, s|
67
67
  s[hmt.first] = hms.delete(hmt.last.options[:through]) # End up with a hash of HMT names pointing to join-table associations
68
68
  end
69
- hms_headers = hms.each_with_object(+'') { |hm, s| s << "<th>HM#{'T' if hm.last.options[:through]} #{hm.first}</th>\n" }
69
+ hms_headers = hms.each_with_object(+'') { |hm, s| s << "<th>H#{hm.last.macro == :has_one ? 'O' : 'M'}#{'T' if hm.last.options[:through]} #{hm.first}</th>\n" }
70
70
  hms_columns = hms.each_with_object(+'') do |hm, s|
71
71
  hm_fk_name = if hm.last.options[:through]
72
72
  associative = associatives[hm.last.name]
@@ -74,9 +74,15 @@ module Brick
74
74
  else
75
75
  hm.last.foreign_key
76
76
  end
77
- s << "<td>
77
+ s << if hm.last.macro == :has_many
78
+ "<td>
78
79
  <%= link_to \"#\{#{obj_name}.#{hm.first}.count\} #{hm.first}\", #{hm.last.klass.name.underscore.pluralize}_path({ #{hm_fk_name}: #{obj_name}.#{pk} }) unless #{obj_name}.#{hm.first}.count.zero? %>
79
80
  </td>\n"
81
+ else # has_one
82
+ "<td>
83
+ <%= obj = #{obj_name}.#{hm.first}; link_to(obj.brick_descrip, obj) if obj %>
84
+ </td>\n"
85
+ end
80
86
  end
81
87
 
82
88
  inline = case args.first
@@ -89,7 +95,7 @@ module Brick
89
95
  <table id=\"#{table_name}\">
90
96
  <tr>
91
97
  <% is_first = true; is_need_id_col = nil
92
- bts = { #{bts.each_with_object([]) { |v, s| s << "#{v.first.inspect} => [#{v.last.first.inspect}, #{v.last.last.name}, #{v.last.last.primary_key.inspect}]"}.join(', ')} }
98
+ bts = { #{bts.each_with_object([]) { |v, s| s << "#{v.first.inspect} => [#{v.last.first.inspect}, #{v.last[1].name}, #{v.last[1].primary_key.inspect}]"}.join(', ')} }
93
99
  @#{table_name}.columns.map(&:name).each do |col| %>
94
100
  <% next if col == '#{pk}' || ::Brick.config.metadata_columns.include?(col) %>
95
101
  <th>
@@ -125,9 +131,9 @@ module Brick
125
131
  <% next if k == '#{pk}' || ::Brick.config.metadata_columns.include?(k) %>
126
132
  <td>
127
133
  <% if (bt = bts[k]) %>
128
- <%= obj = bt[1].find_by(bt.last => val); link_to obj.brick_descrip, obj %>
134
+ <%= obj = bt[1].find_by(bt.last => val); link_to(obj.brick_descrip, obj) if obj %>
129
135
  <% elsif is_first %>
130
- <%= is_first = false; link_to val, #{obj_name} %>
136
+ <%= is_first = false; link_to val, #{obj_name}_path(#{obj_name}.#{pk}) %>
131
137
  <% else %>
132
138
  <%= val %>
133
139
  <% end %>
@@ -5,7 +5,7 @@ module Brick
5
5
  module VERSION
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 5
8
+ TINY = 6
9
9
 
10
10
  # PRE is nil unless it's a pre-release (beta, RC, etc.)
11
11
  PRE = nil
data/lib/brick.rb CHANGED
@@ -81,6 +81,10 @@ if Gem::Specification.all_names.any? { |g| g.start_with?('rails-') }
81
81
  require 'brick/frameworks/rails'
82
82
  end
83
83
  module Brick
84
+ def self.sti_models
85
+ @sti_models ||= {}
86
+ end
87
+
84
88
  class << self
85
89
  # All tables and views (what Postgres calls "relations" including column and foreign key info)
86
90
  def relations
@@ -107,7 +111,7 @@ module Brick
107
111
  end
108
112
 
109
113
  s.first[a.foreign_key] = [a.name, a.klass]
110
- when :has_many
114
+ when :has_many, :has_one
111
115
  s.last[a.name] = a
112
116
  end
113
117
  s
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brick
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lorin Thwaits