繁体   English   中英

在Ruby中查询has_and_belongs_to_many关联

[英]Querying a has_and_belongs_to_many association in Ruby

好。 我要实现的目标是基于基于特定文章的相关文章列表,并且我想根据与该文章相关的类别来获取这些相关文章。 我在这两个模型之间建立了一个简单的habtm关系:article和category(联接表名为articles_categories )。 我想基于与一个文章具有相同category_id的文章来创建相关文章查询。 例如,商品#1与类别#1和类别#2相关联。 我想编写一个查询,以获取文章#1的类别ID,然后在文章模型中查询与那些相同类别,类别#1和类别#2相关联的所有文章。 我已经在阳光下尝试了一切,似乎无法弄清楚。 我尝试了各种.join语句,但似乎没有任何效果。 我试图将其分为以下两个部分:

我可以像这样获取要引用的特定文章的所有类别ID:

article_cat_ids = @article.category_ids

第二部分是基于这些类别ID的文章过滤器,但我无法弄清楚这部分。

所以我的问题是,如何获取与数组article_cat_ids的类别ID相关联的文章数组。 而且,作为奖励,我希望排除我最初引用的用于创建article_cat_ids的特定文章,以便文章列表中不包括我试图获取相关文章的文章。

任何帮助,将不胜感激。

听起来不错。 我认为您的数据模型很棒。

让我们首先尝试在SQL中进行操作。 这将指导我们使用ActiveRecord解决方案。

select a1.id
from articles a1
inner join articles_categories ac1 on ac1.article_id = a1.id
inner join articles_categories ac2 on ac2.category_id = ac1.category_id
inner join articles a2 on a2.id = ac2.article_id
where a2.id = $1
  and a1.id <> $1;

这可行,但是您也可以使用子句中的子查询。 您应该进行一些基准测试,以查看哪种数据效果更好。

现在,我们如何将其转换为ActiveRecord? 老实说,您可能不想这样做。 无论如何,您最终将编写大量的SQL。

article_id = 1 # or whatever
Article.
  joins('articles_categories ac1 on ac1.article_id = articles.id').
  joins('articles_categories ac2 on ac2.category_id = ac1.category_id').
  joins('articles a2 on a2.id = ac2.article_id').
  where(['a2.id = ? and a1.id <> ?', article_id])

在这些情况下,AR是一个泄漏抽象。 这应该可以工作,但是在我看来,它比普通的SQL可读性差。

请注意,此解决方案是单个查询。 当心其他涉及多个查询的解决方案。 如果使用,很容易在这里遇到1 + N查询问题,例如,ruby中的循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM