2

我正在开发一个 Rails 3 应用程序,它(为了这个问题)通过关联Posts链接到多个Categories,反之亦然has_and_belongs_to_many

Post < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

Category < ActiveRecord::Base
  has_and_belongs_to_many :posts
end

我试图弄清楚如何编写一个 ActiveRecord(或 ARel)查找器来检索每个Post 链接到两个的所有Posts位置。我了解我最终要生成的 SQL(两个带有别名的 INNER JOINS 以便能够区分每一个以匹配两者),但到目前为止我还没有找到创建查询的方法诉诸原始 SQL 位。CategoriesCategories

在这种情况下,避免自定义 SQL 如此重要的原因是,我正在编写的代码是通用的并且是大量数据驱动的,并且它需要与Post对象查询中的其他过滤(和排序)限定符混合,所以我可以'不仅仅是硬编码方法调用Post(例如访问 的集合Categories)或自定义 SQL,它们可能无法与其他过滤器生成的 SQL 很好地混合。

has_many :through如果以某种方式使事情变得更容易,或者甚至查看其他 ORM 选项(DataMapper、Mongoid 等),我愿意切换到使用连接模型(.

我很惊讶这在 ActiveRecord/ARel 中并不容易/更明显,但也许我只是不知道要搜索以找到答案的神奇关键字。ARel 的文档也非常少,所以我很茫然。任何帮助将非常感激!

4

1 回答 1

1

经过相当多的谷歌搜索,我发现这两篇文章(从 2006 年开始!)最终引导我在 ActiveRecord/ARel 中找到正确答案:

http://blog.hasmanythrough.com/2006/6/12/when-associations-arent-enough

http://blog.hasmanythrough.com/2006/6/12/when-associations-arent-enough-part-2

产生我正在寻找的(几乎)无 SQL 代码是对 SQL 中GROUP BYandHAVING运算符的非常聪明的使用:

Post.joins(:categories).where("categories.name" => ['catA','catB']).group('posts.id').having('COUNT(posts.id) = 2')

基本上,它会找到与任何给定的所有Posts相关联(包括重复项,如果我们希望有匹配多个),按字段列出的组on我们想要的比赛。CategoriesPostsCategoriesidPost

我没有尝试将此代码与我在其他字段上的过滤器混合Post,但我很确定它会起作用。

于 2012-03-05T05:47:45.930 回答