Ruby on rails 有没有更好的方法来编写这个命名的范围?[轨道]
我使用这个命名范围来搜索描述与用户输入的任何单词匹配的产品 例如,产品说明\u like \u anychoc pret 将返回名称如下的产品 巧克力棒 巧克力椒盐卷饼 微型巧克力小马 这是我写的有效的命名范围Ruby on rails 有没有更好的方法来编写这个命名的范围?[轨道],ruby-on-rails,ruby,idioms,Ruby On Rails,Ruby,Idioms,我使用这个命名范围来搜索描述与用户输入的任何单词匹配的产品 例如,产品说明\u like \u anychoc pret 将返回名称如下的产品 巧克力棒 巧克力椒盐卷饼 微型巧克力小马 这是我写的有效的命名范围 named_scope :description_like_any, (lambda do |query| return {} unless query conditions = [] values = [] for q in query.split(/\s+/)
named_scope :description_like_any, (lambda do |query|
return {} unless query
conditions = []
values = []
for q in query.split(/\s+/)
conditions << "(`products`.description LIKE ?)"
values << "%#{q}%"
end
{ :conditions => [conditions.join(' AND '), *values] }
end)
控制器
意见
最讽刺的是不要自己写这封信使用优秀的gem,它将为您创建类似于任何范围的描述 编辑:如果您希望您的用户能够在这样的自由文本字段中输入搜索词,您可以定义自己的范围:
class Product < ActiveRecord::Base
# ...
scope_procedure :description_like_any_term, lambda { |terms|
name_like_any(terms.split(/\s+/))
}
# ...
end
最讽刺的是不要自己写这封信使用优秀的gem,它将为您创建类似于任何范围的描述 编辑:如果您希望您的用户能够在这样的自由文本字段中输入搜索词,您可以定义自己的范围:
class Product < ActiveRecord::Base
# ...
scope_procedure :description_like_any_term, lambda { |terms|
name_like_any(terms.split(/\s+/))
}
# ...
end
我使用的是searchlogic,但如果用户输入choc pret,我希望它搜索任何单词。如果我简单地使用,searchlogic将从产品中生成SELECT*,其中的描述类似于“%choc pret%”。我需要它从产品中选择*,其中的描述如“%choc%”或描述如“%pret%”。首先,这听起来像是一个全文搜索引擎的工作。如果您的描述太多和/或太长,可以选择Sphinx、Solr或mysql全文。否则,您可以这样做,但您需要解析用户的输入。类似于。。。参数[:search][:description\u like\u any]=参数[:search][:description\u like\u any].split/\s+/。。。在你真正调用Product.searchparams[:search]@Dave Pirotte之前,既然你很厉害,我猜你可能也有这个问题的答案当然,我只是在上面放了些东西。。。Rails 3/meta_search解决了这个问题,但AFAIK Searchlogic没有任何东西可以解决这个问题。我使用的是Searchlogic,但如果用户输入choc pret,我希望它搜索任何单词。如果我简单地使用,searchlogic将从产品中生成SELECT*,其中的描述类似于“%choc pret%”。我需要它从产品中选择*,其中的描述如“%choc%”或描述如“%pret%”。首先,这听起来像是一个全文搜索引擎的工作。如果您的描述太多和/或太长,可以选择Sphinx、Solr或mysql全文。否则,您可以这样做,但您需要解析用户的输入。类似于。。。参数[:search][:description\u like\u any]=参数[:search][:description\u like\u any].split/\s+/。。。在你真正调用Product.searchparams[:search]@Dave Pirotte之前,既然你很厉害,我猜你可能也有这个问题的答案当然,我只是在上面放了些东西。。。Rails 3/meta_搜索解决了这个问题,但AFAIK Searchlogic没有任何东西可以解决这个问题。
# app/views/products/index.html.erb
<% form_for @search do |f| %>
<%= f.label :keywords, "Quick Search" %>
<%= f.input :keywords %>
<%= f.submit, "Go" %>
<% end %>
class Product < ActiveRecord::Base
# ...
scope_procedure :description_like_any_term, lambda { |terms|
name_like_any(terms.split(/\s+/))
}
# ...
end