8

Rails アプリに pg_search を追加しています。私は構成を完全には理解していません。正しい方向に向けて穏やかに微調整していただければ幸いです。

まず、多かれ少なかれマルチ モデル サイトが既にセットアップされており、アプリで実行されています。しかし、関連するモデルも検索できるように拡張したいと考えています。

たとえば、Manufacturer、Car、Model クラスがあります。現在、「フォード」を検索すると、メーカーのみが返されます。また、関連するすべての車 (製造元に属する) とモデル (車に属する) も返品したいと思います。

スコープ検索としてこれを行う方法を見ることができます

class Car
  pg_search_scope :manufactured_by, :associated_against => {
    :manufacturer => [:name]
  }
end

しかし、マルチサーチでこれをやろうとするとうまくいきません

class Car
  include PgSearch
  multisearchable :against => [:name], 
    :associated_against => {
        :manufacturer => [:name]
      }
end

エラーは生成されず、関連付けられたレコードが取得されないだけです。

これらすべてがどのように組み合わされるかを理解する上で、根本的な何かが欠けているように感じます。誰かがこれを理解するのを手伝ってくれたり、良い情報源を教えてくれたりして本当に感謝しています. 私は github と関連する Railscast に関する情報を確認しましたが、まだ何かが欠けています。

4

1 に答える 1

14

Rails と SQL でポリモーフィックな関連付けがどのように機能するかにより、関連付けられたレコードをマルチサーチで検索することはできません。

将来的に混乱しないように、状況を説明するエラーを追加します。

混乱させて申し訳ありません。

代わりにできることは、検索対象のテキストを返す Car のメソッドを定義することです。

class Car < ActiveRecord::Base
  include PgSearch
  multisearchable :against => [:name, manufacturer_name]
  belongs_to :manufacturer

  def manufacturer_name
    manufacturer.name
  end
end

または、さらに簡潔にするために、次のように委任できます。

class Car < ActiveRecord::Base
  include PgSearch
  multisearchable :against => [:name, manufacturer_name]
  belongs_to :manufacturer
  delegate :name, :to => :manufacturer, :prefix => true
end

ただし、Manufacturer インスタンスの名前を変更した場合は、pg_search_documents テーブルが更新されていることを確認する必要があるため、:touch => trueその関連付けに追加する必要があります。

class Manufacturer < ActiveRecord::Base
  has_many :cars, :touch => true
end

このようにして、Manufacturer が更新されると、すべての Car レコードで Active Record コールバックが呼び出され、pg_search コールバックがトリガーされて、対応する pg_search_documents エントリに保存されている検索可能なテキストが更新されます。

于 2012-05-11T00:14:35.163 に答える