2012-04-15 8 views
3

検索したい複数のモデルがあり、結果にすべてのモデルの結果が含まれるようにします。 「ブーツ」の検索をしたいとしましょう。ブーツのカテゴリを返すだけでなく、実際のブーツだけでなくブーツを販売する小売業者も返すようにしたいとしましょう。カテゴリ、ベンダー、製品のモデルがあります。私はここでどのような関係を探していますか?

すべてのオブジェクトが結合を必要とするため、この場合は結合テーブルを作成する必要はなく、すべてのオブジェクトを検索に含める必要があるため、これは不要です。

私は豪華な宝石を使用することを考えていますが、これは私の検索手順に関係なく同じであるため、これは質問にとって重要ではないと私は考えています。

多分、結び付いた関係が意味をなさないかもしれませんが、私はそれの周りに私の頭を包み込むことはできません。

答えて

1

はここにあなたのクエリです:

string_to_search = 'boots' 
@products = Product.where("title LIKE ?", "%#{string_to_search}%").includes(:vendor, :category).all 

それはすべてのカテゴリとベンダーと一緒に必要なタイトルの内容を持つすべての製品を取得します。特定の製品のカテゴリ/ベンダーを取得するための追加のクエリを使用せずに、結果のデータをトラバースすることができます。

あなたは@productsからベンダーのリストを抽出し、たとえば、必要があります場合は - ちょうど使用:

@vendors = @products.map &:vendor 
+0

これはすてきな解決策です。私の回答は、あなたの検索が複数の属性、すなわちタイトル、製品の説明、またはベンダーの説明属性などにあると仮定していました。私は一種の豪華な宝石についてあなたの意見を見逃していましたが、私はそれを知らないのですが、この回答と組み合わせてransackがActiveModelによって変形されたUNIONSよりも簡単であるように思えます。 – RadBrad

+0

これは、カテゴリ名またはベンダープロパティ(名前、販売用の製品など)がクエリと一致する状況を処理しません。結果セットにはタイプに関係なく一致するオブジェクトが含まれている必要があるため、ベンダー、カテゴリ、および製品を含むように結果が必要です。 – Eric

+0

その場合は、3つのクエリが必要です。1つのモデルにつき1つです。 – jdoe

0

手作業で作成したSQLクエリでUNION演算子を使用する必要があると思います。 ActiveModelを使用して擬似モデルを作成することができます。アグリゲーターとして機能し、実際のモデルから検索結果を収集し、クエリ用のActiveRecordのようなインターフェースを提示することができます。あなたのProductbelongs_toVendorbelongs_toCategoryを想定すると、

+0

私はRoRのグッズの多くを失うだろうとSQLマニュアルのルートを避けるために傾いています。あなたが記述しているように集計モデルを作成するにはどうしたらいいですか? – Eric

+0

私の回答は一つの解決策でした。あなたは手動のSQL UNIONを使用し、ActiveModelでそれを包み込んでRoRグッズを取り戻しました。私とチャットして、私はそれを歩くことができます – RadBrad

+0

ああ、私は参照してください。あなたのチャット情報は表示されません。どうすれば接続できますか? – Eric