【问题标题】:finding Post associated with both of two Categories in Rails 3 without custom SQL在没有自定义 SQL 的情况下,在 Rails 3 中查找与两个类别相关联的 Post
【发布时间】:2012-03-03 20:24:15
【问题描述】:

我正在开发一个 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)查找器来检索所有 Posts,其中 每个 Post 链接到两个 @ 中的 both 987654326@。我了解我最终要生成的 SQL(两个带有别名的 INNER JOINS 能够区分每个以匹配两个Categories),但到目前为止我还没有想出创建的方法查询而不使用原始 SQL 位。

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

我愿意切换到使用连接模型 (has_many :through),如果这样可以让事情变得更容易,或者甚至查看其他 ORM 选项(DataMapper、Mongoid 等),但这似乎是一个巨大的变化让一些如此基本的工作。

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

【问题讨论】:

    标签: ruby-on-rails-3 activerecord has-and-belongs-to-many arel ruby-datamapper


    【解决方案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 BYHAVING 运算符的非常巧妙的使用:

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

    基本上,它会找到与给定Categoriesany 相关联的所有Posts(包括重复项,如果我们希望有匹配多个CategoriesPosts),组该列表由Post 上的id 字段列出,然后将结果缩减为仅包含具有我们想要的匹配数量的组。

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

    【讨论】:

    • 它确实有效,尽管您不能同时对多对多关联执行此操作,但对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多