如何在rails中加入命名范围

时间:2014-12-02 02:06:28

标签: ruby-on-rails activerecord

我希望加入我的命名范围,因为我使用数组生成它们。 我怎么会这样做,我不能加入命名范围,有更好的方法吗?

 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'})  

2 个答案:

答案 0 :(得分:0)

返回数组时无法链接范围。

你可以:

  1. 尝试返回关系:

    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)
    
  2. 您可能希望阅读全文搜索,要扩展此主题,我需要知道您正在使用的数据库。

答案 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

希望这对你有所帮助。