我希望加入我的命名范围,因为我使用数组生成它们。 我怎么会这样做,我不能加入命名范围,有更好的方法吗?
scope :search, ->(attrs_for_search,params) do
if attrs_for_search.present?
params_to_search_on = params.keys & attrs_for_search
params_to_search_on.collect{|x| where("#{x} ILIKE ?", "%#{params[x]}%") }
else
none
end
end
Contact.search(%w[email],{'email => 'jason'})
答案 0 :(得分:0)
返回数组时无法链接范围。
你可以:
尝试返回关系:
results = params_to_search_on.collect{|x| where("#{x} ILIKE ?", "%#{params[x]}%") }
where(id: results.flatten.map(&:id))
我没有对此进行测试,但我认为您需要flatten
,因为结果是一系列关系[rel_1,_rel_2]
然后你可以使用/ chain / attach-a-bunch-scope这样的范围:
Contact.search(attrs, params).other_scope.another_scope(with_params)
您可能希望阅读全文搜索,要扩展此主题,我需要知道您正在使用的数据库。
答案 1 :(得分:0)
我认为你可以创建一个范围并使用'发送'加入范围的方法。
scope :search, ->(field, value) do
where("#{field} LIKE ?", "%#{value}%")
end
def self.multi_search(params)
result = nil
params_to_search_on = params.keys
params_to_search_on.each do |k|
if result.nil?
result = Message.send(:search, k, params[k])
else
result = result.send(:search, k, params[k])
end
end
result
end
希望这对你有所帮助。