0

ItemTag というモデルを介して多対多の関係を持つ Item と Tag の 2 つのモデルがあります。ユーザーが、指定された tags.tag_name のすべてのセットを持つすべてのアイテムを見つけられるようにしたいと考えています。したがって、テーブルは次のようになります。


アイテム

ID

...


アイテムタグ

ID

item_id

tag_id

...


タグ

ID

タグ名

...

データベースに次の item / tag_name の組み合わせがあるとします (items_tags 結合テーブルですが)

項目 1: 「赤」、「黄」、「青」

項目 2: 「赤」、「黄」、「オレンジ」

項目 3: 「赤」、「オレンジ」、「紫」

ユーザーは、Tag.tag_names "red" と "yellow" に関連付けられているすべてのアイテムを取得したいと考えています (明らかに、アイテム 1 とアイテム 2 が返されます)。Rails3でこれを構築するにはどうすればよいですか? 私の仮定では、SQL ステートメントは次のことを行う必要があります。

1: item_tags と tags を結合し、tag_name "red" を持つタグに関連付けられているすべての items_tags 行を取得します。

2: その結果セットを再度タグ テーブルに結合し、結果セットを tag_name "yellow" のタグに関連付けられた行に絞り込みます。

3: アイテムを最終結果セットと結合して、両方のタグに関連付けられたアイテムのリストを取得します

選択される tag_names の数は任意であることに注意してください。ユーザーは基準として 1..n tag_names を選択する可能性があるため、できれば生の SQL を使用せずに、このクエリを動的に構築できる必要があります。

4

1 に答える 1

0

まず、モデルに関連付けを設定する必要があります。

アイテム

has_many :item_tags
has_many :tags, :through => item_tags

アイテムタグ

belongs_to :item
belongs_to :tag

タグ

has_many :item_tags
has_many :items, :through => item_tags

次に、コントローラーでこれを行うことができます:

red_tag_items = Tag.find_by_name('red').items
yellow_tag_items = Tag.find_by_name('yellow').items

red_yellow_tag_items = red_tag_items & yellow_tag_items

これを行うためのより効率的な方法があるはずです。知りたいです。:)

于 2013-04-23T21:54:33.840 に答える