我在概念上遇到了麻烦,所以我希望能找到一些如何处理这项任务的指导。
这个例子有点武断,但我希望它可以在这里显示我的目标。
3个模特,加入
class Manufacturer < ActiveRecord::Base
has_many :models
end
class Model < ActiveRecord::Base
belongs_to :manufacturer
has_many :editions
end
class Edition < ActiveRecord::Base
belongs_to :model
end
我想要合并数据,以便搜索任何匹配
<% @editions.each do |edition| %>
<% model = edition.model %>
<% manufacturer = model.manufacturer %>
<%= "#{manufacturer.name} #{model.name} #{edition.name}" %>
使这复杂化。我想将此视为3种选择以便跟踪。
我认为这样做的方法是在分离匹配时使用模糊搜索进行匹配,并使用tokeninput或类似方法进行显示。
我认为eBay可能会做一些类似于快速上市销售页面的内容。
然后像
class Search < ActiveRecord::Base
has_one :manufacturer
has_one :model
has_one :edition
end
答案 0 :(得分:1)
如果我明白你在问什么,那会是什么:
@editions = Edition.joins(model: :manufacturer)
.where("models.name = :q OR manufacturers.name = :q OR editions.name = :q", q: params[:q])
答案 1 :(得分:0)
所以,是的,您可以使用连接执行此操作,而不是将其存储在单个表中。
为了使它变得非常简单,我将使用Ernie Miller的吱吱声宝石
http://railscasts.com/episodes/354-squeel
它允许这种语法:
Edition.joins{ model.manufacturer }.where{ (edition.name =~ "%#{params[:q]}%") || ( edition.model.name =~ "%#{params[:q]%}" || ( edition.model.manufacturer.name =~ "%#{prams[:q]}%" ) }
如果表变大,这可能是连接的性能问题
如果是这种情况,那么使用ElasticSearch索引模型将消除这种情况
http://railscasts.com/episodes/306-elasticsearch-part-1
http://railscasts.com/episodes/307-elasticsearch-part-2
当然还有其他全文搜索引擎,Solr,Sphinx