rails join模型进行搜索

时间:2013-01-17 00:21:35

标签: ruby-on-rails database-design ruby-on-rails-3.2

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

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

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 =&gt; [:editions,:manufacturer])会给我一切,但这不会扩展到第四个模型?
  • 假设我需要在搜索表单中使用这些捕获或其他方式,我需要在文本字段和控制器中分别使用它们。
  • 我认为另一种方法是将其存储在单个表中,永久存储或作为查找表存储。其中的单个选择包含收集所有信息的参考

Search results from combined models

然后像

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

2 个答案:

答案 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