Class: Miscellany::ComputedColumns::ComputedBuilder
- Inherits:
-
Object
- Object
- Miscellany::ComputedColumns::ComputedBuilder
- Defined in:
- lib/miscellany/active_record/computed_columns.rb
Instance Method Summary collapse
- #apply(q) ⇒ Object
-
#initialize(relation, key, args, &blk) ⇒ ComputedBuilder
constructor
A new instance of ComputedBuilder.
Constructor Details
#initialize(relation, key, args, &blk) ⇒ ComputedBuilder
Returns a new instance of ComputedBuilder.
45 46 47 48 49 50 51 |
# File 'lib/miscellany/active_record/computed_columns.rb', line 45 def initialize(relation, key, args, &blk) @relation = relation @key = key @args = args.is_a?(Array) ? args : [args] @block = blk @compiled = {} end |
Instance Method Details
#apply(q) ⇒ Object
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/miscellany/active_record/computed_columns.rb', line 66 def apply(q) instance_exec(*@args, &@block) c = @compiled raise "defined_computed: query must be provided" unless c[:query] join_name = @key.to_s base_table_name = current_table_from_scope(q) c[:join_condition] ||= "COMPUTED.id = #{base_table_name}.id" c[:select] ||= "#{join_name}.value AS #{@key}" q = q.select("#{base_table_name}.*") if !q.values[:select].present? select_statement = c[:select].gsub('COMPUTED', join_name) join_condition = c[:join_condition].gsub('COMPUTED', join_name) join_query = c[:query] join_query = join_query.to_sql if join_query.respond_to?(:to_sql) q.select(select_statement).joins("LEFT OUTER JOIN (#{join_query}) #{join_name} ON #{join_condition}") end |