1

以下を混合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))

(言うまでもなく、注入もあまりエレガントではありません-どうすれば改善できますか?)

4

1 に答える 1