Rails子查询/嵌套连接在多对多关联上

时间:2013-04-23 13:55:33

标签: sql ruby-on-rails-3 activerecord arel

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


ID

...


items_tags

ID

ITEM_ID

TAG_ID

...


标记

ID

TAG_NAME

...

假设我在db中有以下项目/ tag_name组合(尽管items_tags连接表)

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

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

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

用户希望获得与Tag.tag_names“red”和“yellow”相关联的所有项目(显然应返回项目1和项目2)。我如何在Rails3中构造它?我的假设是SQL语句需要:

1:join items_tags和tags,获取与tag_name为“red”的标记关联的所有items_tags行

2:使用tags表再次连接该结果集,将结果集缩小为与tag_name“yellow”的标记关联的行

3:使用最终结果集连接项目以获取与两个标记相关联的项目列表

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

1 个答案:

答案 0 :(得分: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

必须有更有效的方法来做到这一点。很想知道。 :)