class Generators::Joined

Public Instance Methods

generate() click to toggle source
# File lib/toschas/filterable/generators/joined.rb, line 3
def generate
  filters.each do |filter|
    field = joined_field(filter)
    generate_joined_filter(filter, field, relation_name, options[:joins])
    if table_loaded? && range_filter?(field)
      generate_range_filter(filter, field, relation_name, options[:joins])
    end
  end
end

Private Instance Methods

define_range_filter(prefix, filter, field, relation_name, join_options) click to toggle source
# File lib/toschas/filterable/generators/joined.rb, line 38
def define_range_filter(prefix, filter, field, relation_name, join_options)
  operand = prefix == :from ? '>' : '<'

  model.define_singleton_method(
    "#{prefix}_#{filter}",
    ->(value) {
      send(:joins, join_options)
      .send(:where, 
            "#{relation_name.to_s.pluralize}.#{field} #{operand} ?", 
      value)
    }
  )
end
extract_relations(join_options) click to toggle source
# File lib/toschas/filterable/generators/joined.rb, line 53
def extract_relations(join_options)
  if join_options.is_a?(Hash)
    join_options.flat_map{|k, v| [k, *extract_relations(v)]}
  else
    [join_options]
  end
end
generate_joined_filter(filter, field, relation_name, join_options) click to toggle source
# File lib/toschas/filterable/generators/joined.rb, line 19
def generate_joined_filter(filter, field, relation_name, join_options)
  model.define_singleton_method(
    "by_#{filter}",
    ->(value) {
      send(:joins, join_options)
      .send(:where, 
            { relation_name.to_s.pluralize => { 
        field => value } 
      }
           )
    }
  )
end
generate_range_filter(filter, field, relation_name, join_options) click to toggle source
# File lib/toschas/filterable/generators/joined.rb, line 33
def generate_range_filter(filter, field, relation_name, join_options)
  define_range_filter(:from, filter, field, relation_name, join_options)
  define_range_filter(:to, filter, field, relation_name, join_options)
end
joined_field(filter) click to toggle source
# File lib/toschas/filterable/generators/joined.rb, line 69
def joined_field(filter)
  filter.to_s.split("#{relation_name}_").last
end
range_filter?(filter) click to toggle source
# File lib/toschas/filterable/generators/joined.rb, line 73
def range_filter?(filter)
  range_types.include?(
    relation_name.to_s.classify.constantize
    .type_for_attribute(filter.to_s).type
  )
end
relation() click to toggle source
# File lib/toschas/filterable/generators/joined.rb, line 15
def relation
  relation_name.to_s.classify.constantize
end
relation_name() click to toggle source
# File lib/toschas/filterable/generators/joined.rb, line 65
def relation_name
  @relation_name ||= relations.last
end
relations() click to toggle source
# File lib/toschas/filterable/generators/joined.rb, line 61
def relations
  @relations ||= extract_relations(options[:joins])
end