以下を混合SQL/文字列の代わりに厳密にArelメソッドを使用するように変換する方法は知っていますが、結果のarelオブジェクトをActiveRecord::Relationにマージする方法がわからないので、さらにAR::Relationメソッドを連鎖させることができます.
以前の質問に対して、次の非常に役立つ回答を得ました。
class Address < ActiveRecord::Base
scope :anywhere, lambda{|search|
attrs = [:line1, :line2, :city, :state, :zip]
where(attrs.map{|attr|
"addresses.#{attr} LIKE :search"
}.join(' OR '), search: "#{search}%").order(*attrs)
}
end
Person.joins(:address).merge(Address.anywhere(query_term))
私はこのようなことをしようとしました:
class Address < ActiveRecord::Base
scope :anywhere, lambda{|search|
addr_arel = Address.arel_table
attrs = [:line1, :line2, :city, :state, :zip]
attrs.inject {|attr|
q = addr_arel[attr].match("%#{search}%") unless q
q = q.or(addr_arel[attr].match("%#{search}%")
}
}
end
しかし、私は arel オブジェクトになってしまい、それを次の ActiveRecord::Relation とマージする方法がわかりません:
Person.joins(:address).merge(Address.anywhere(query_term))
(言うまでもなく、注入もあまりエレガントではありません-どうすれば改善できますか?)