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つの選択として扱いたいと思います。

私がこれを予測する方法は、マッチングにあいまい検索を使用し、一致を分離しながらトークン入力などを表示することです。

私の頭の中では、eBay がクイック リストの販売ページの一部として同様のことを行う可能性があると思います。

考え:

  • Model.find(:all, :joins => [:editions, :manufacturer] ) ですべてが得られますが、これは 4 番目のモデルに拡張できませんか?
  • これらのキャプチャを検索フォームなどで使用する必要があると仮定すると、テキスト フィールド内とコントローラー内の両方でそれらを分離する必要があります。
  • 別の方法は、これを単一のテーブルに永続的にまたはルックアップ テーブルとして格納することです。この単一の選択には、すべての情報を収集するための参照が含まれています

組み合わせ機種の検索結果

そして、次のようなもの

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 を使用してモデルのインデックスを作成すると、それが解消されます。 もちろん、他の全文検索エンジン、Solr、Sphinx があり
ます

于 2013-01-17T14:21:45.190 に答える