有没有更好的方法来编写这个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.descriptionproduct.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