提交 fdc62cdc 编写于 作者: P Pratik Naik

Use Arel::Attribute when building where conditions from hash

上级 2f864395
......@@ -104,14 +104,16 @@ def joins(join, join_type = nil)
def where(*args)
return spawn if args.blank?
if [String, Hash, Array].include?(args.first.class)
conditions = @klass.send(:merge_conditions, args.size > 1 ? Array.wrap(args) : args.first)
conditions = Arel::SqlLiteral.new(conditions) if conditions
conditions = if [String, Array].include?(args.first.class)
merged = @klass.send(:merge_conditions, args.size > 1 ? Array.wrap(args) : args.first)
Arel::SqlLiteral.new(merged) if merged
elsif args.first.is_a?(Hash)
build_predicate_from_hash(args.first)
else
conditions = args.first
args.first
end
spawn(@relation.where(conditions))
spawn(@relation.where(*conditions))
end
private
......@@ -128,5 +130,34 @@ def reverse_sql_order(order_query)
}.join(',')
end
def build_predicate_from_hash(attributes, default_table = self.table)
attributes = @klass.send(:expand_hash_conditions_for_aggregates, attributes)
predicates = attributes.map do |column, value|
arel_table = default_table
if value.is_a?(Hash)
arel_table = Arel::Table.new(column, Arel::Sql::Engine.new(@klass))
build_predicate_from_hash(value, arel_table)
else
column = column.to_s
if column.include?('.')
table_name, column = column.split('.', 2)
arel_table = Arel::Table.new(table_name, Arel::Sql::Engine.new(@klass))
end
case value
when Array, Range, ActiveRecord::Associations::AssociationCollection, ActiveRecord::NamedScope::Scope
arel_table[column].in(value)
else
arel_table[column].eq(value)
end
end
end
predicates.flatten
end
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册