【问题标题】:Rails subquery / nested join on a many-to-many associationRails 子查询/嵌套连接上的多对多关联
【发布时间】:2013-04-23 13:55:33
【问题描述】:

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


项目

身份证

...


items_tags

身份证

item_id

tag_id

...


标签

身份证

标签名称

...

假设我在 db 中有以下 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:将项目与最终结果集连接,得到两个标签关联的项目列表

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

【问题讨论】:

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


    【解决方案1】:

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

    物品

    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
    

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

    【讨论】:

      猜你喜欢
      • 2023-02-25
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 2018-01-03
      • 2014-10-22
      相关资源
      最近更新 更多