Class: Miscellany::ComputedColumns::ComputedBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/miscellany/active_record/computed_columns.rb

Instance Method Summary collapse

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