我试图在我的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)
更多关于范围[这]