【问题标题】:Query with multiple, optional where conditions (clauses) in Rails 3?在 Rails 3 中使用多个可选的 where 条件(子句)进行查询?
【发布时间】:2013-01-29 05:54:37
【问题描述】:

如何通过 Rails 3.2 中每个可选的多个参数进行搜索/过滤?通过以下设置,我目前收到以下错误。非常感谢任何帮助。

undefined method `paginate' for nil:NilClass

Application Trace | Framework Trace | Full Trace
app/controllers/contacts_controller.rb:50:in `index'

这是我的联系人控制器中的索引操作:

def index
  city = params[:city]
  state = params[:state]
  zip = params[:zip]
  @contacts = Contact.search(city,state,zip).paginate(:page => params[:page], :per_page => items_per_page)
end

这是我的联系人模型中的搜索方法:

def self.search(city, state, zip)
  joins(:profile => :addresses)
  .where("city like ?", "%#{city}%") unless city.blank?
  .where("state = ?", state) unless state.blank?
  .where("zip like ?", "%#{zip}%") unless zip.blank?
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2


    【解决方案1】:

    尝试更明确地返回,例如像这样:

    def self.search(city, state, zip)
      query_obj = joins(:profile => :addresses)
      query_obj = query_obj.where("city like ?", "%#{city}%") unless city.blank?
      query_obj = query_obj.where("state = ?", state) unless state.blank?
      query_obj = query_obj.where("zip like ?", "%#{zip}%") unless zip.blank?
    
      query_obj
    end
    

    【讨论】:

    • 这是一个很好的解决方案。
    【解决方案2】:
    def self.search(city, state, zip)
      conditions = {:"city like %?%" => city, :state => state, :"zip like %?%" => zip}
      conditions.delete_if {|key,val| val.blank? }
      self.joins(:profile => :addresses)
      .where(conditions)
    end
    

    而您的函数 Contact.search(city,state,zip) 返回 nil,这就是它给出 nil.paginate 错误的原因。

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多