0

我在概念上遇到了麻烦,所以我希望我能找到一些关于如何完成这项任务的指导。

这个例子有点武断,但我希望它可以在这里展示我的目标。

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 可能会在他们的快速上市销售页面中做类似的事情。

想法:

  • Model.find(:all, :joins => [:editions, :manufacturer] ) 会给我一切,但这不会扩展到第四个模型?
  • 假设我需要在搜索表单或其他方式中使用这些捕获,我需要在文本字段和控制器中将它们分开。
  • 我想的另一种方法是将其存储在一个表中,或者永久地或者作为查找表。此处的单个选择包含收集所有信息的参考

组合模型的搜索结果

然后像

class Search < ActiveRecord::Base
    has_one :manufacturer
    has_one :model
    has_one :edition
end
4

2 回答 2

1

如果我明白你在问什么,那么类似:

@editions = Edition.joins(model: :manufacturer)
  .where("models.name = :q OR manufacturers.name = :q OR editions.name = :q", q: params[:q])
于 2013-01-17T09:52:40.197 回答
0

所以,是的,您可以使用连接来执行此操作,而不是将其存储在单个表中。为了让它超级简单,我会使用 Ernie Miller 的 squeel gem
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

于 2013-01-17T14:21:45.190 回答