如何在Rails中有条件地构建ActiveRecord查询?



我试图在我的rails应用程序(仍然是一个新手)建立一个搜索结果页面,我不知道如何建立一个查询rails的方式。

例如,如果没有参数,我想返回所有结果。如果用户在搜索表单中传递1到n个可选参数,我想将它们添加到查询中。

如果排序指定了"price desc"或"year_built desc",甚至两者的组合,则

最后使用will_paginate分隔结果

# default to all listings
@listings = Mls.all
@listings.where("listing_price > ?", params[:listing_price]) unless params[:listing_price].blank?
# ... bunch of other search options ...
@listings.where("property_type = ?", params[:property_type]) unless params[:property_type].blank?
# order
@listings.order("some order by param") if some sort param
@listings.order("some order by param") if some other sort param
# paginate results
@listings.paginate(:page => params[:page])

是否有一个"Rails"的方式做到这一点?

你在高级搜索中看到(修改过的)Railscasts那集了吗?这里是链接:http://railscasts.com/episodes/111-advanced-search-form-revised

基本思想是创建一个Search资源,该资源将处理通过表单发送的搜索参数,并在后台搜索相关模型(在您的示例中为Mls)

这样,而不是检查在控制器的某些参数(例如params[:listing_price])的存在,你可以处理条件在你的搜索模型(models/Search .rb):

def find_listings
  listings = Mls.order(:name)
  listings = listings.where("listing_price > ?", listing_price) if listing_price.present?
  # ... more condition checking
  listings
end

几个链接:

使用第三方gem(元搜索)

从头编写代码

这是我的作用域示例,它将查询数组是否存在

scope :tagged_one_of, -> (tags) { tags ? where("tags && ARRAY[?]::varchar[]", tags) : all }
scope :tagged_all_of, -> (tags) { tags ? where("tags @> ARRAY[?]::varchar[]", tags) : all }

例子
Product.where(filter).where(sub_filter).tagged_one_of(tags_array)

更多关于范围[这]

相关内容

  • 没有找到相关文章

最新更新