我有两个模型,Item和Tag,它们通过名为ItemTag的模型具有多对多关系。我希望用户能够找到所有具有给定标签集的所有项目.tag_name。因此,表格如下所示:
ID
...
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。
答案 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
必须有更有效的方法来做到这一点。很想知道。 :)