我有两个模型,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。