0

我有两个模型,Item 和 Tag,它们通过一个名为 ItemTag 的模型具有多对多关系。我希望用户能够找到所有具有给定tags.tag_name 集的所有项目。因此,表格如下所示:


项目

ID

...


items_tags

ID

item_id

tag_id

...


标签

ID

标签名

...

假设我在数据库中有以下 item / tag_name 组合(尽管 items_tags 连接表)

第 1 项:“红色”、“黄色”、“蓝色”

第 2 项:“红色”、“黄色”、“橙色”

第 3 项:“红色”、“橙色”、“紫色”

用户想要获取与 Tag.tag_names "red" 和 "yellow" 关联的所有项目(显然应该返回项目 1 和项目 2)。我如何在 Rails3 中构建它?我的假设是 SQL 语句需要:

1:连接items_tags和tags,获取所有与tag_name为“red”的tag关联的items_tags行

2:再次将该结果集与 tags 表连接,将结果集缩小到与 tag_name "yellow" 的标签关联的那些行

3:将item与最终结果集join,得到两个tag关联的item列表

请注意,选择的 tag_names 的数量是任意的。用户可以选择 1..n tag_names 作为条件,所以我需要能够动态地构造这个查询,最好不必使用原始 SQL。

4

1 回答 1

0

首先,您需要在模型中设置关联。

项目

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

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