有没有更好的方法来编写这个named_scope?
我正在使用此named_scope来搜索具有与用户输入的任何单词匹配的描述的产品。
例如, Product.description_like_any("choc pret")
将返回名称为的产品
- “巧克力吧”
- “巧克力覆盖椒盐卷饼”
- “迷你巧克力小马”
这是我写的named_scope(有效)
named_scope :description_like_any, (lambda do |query| return {} unless query conditions = [] values = [] for q in query.split(/\s+/) conditions << "(`products`.description LIKE ?)" values < [conditions.join(' AND '), *values] } end)
有没有更好的方法来写这个? 也许我错过了一两个Rubyism / Railism?
解
将scope_procedure
与Searchlogic结合使用,可以更简单的方式完成。 注意,该解决方案甚至可以利用Searchlogic的_or_
语法将两个范围连接在一起。 :keywords
scope_procedure查找与product.description
或product.vendor.name
匹配的product.vendor.name
; 全部有一个文本字段!
模型
# app/models/product.rb class Product < ActiveRecord::Base scope_procedure :keywords, lambda |query| description_like_any_or_vendor_name_like_any(query.split(/\s+/)) end end
调节器
# app/controllers/products_controller.rb class ProductsController < ApplicationController def index @search = Product.search(params[:search]) @products = @search.all end end
查看
# app/views/products/index.html.erb
最Railsy要做的就是不要自己写这个。 :-)使用优秀的Searchlogic gem,它将为您创建description_like_any
范围。
编辑:如果您希望用户能够在这样的自由文本字段中输入搜索词,您可以定义自己的范围:
class Product < ActiveRecord::Base # ... scope_procedure :description_like_any_term, lambda { |terms| name_like_any(terms.split(/\s+/)) } # ... end