如何使用Rails 3范围过滤关联记录不存在的habtm连接表?

时间:2010-10-06 18:09:53

标签: activerecord ruby-on-rails-3 scope join where

我有一个Author模型,其中包含habtm:feeds。使用Rails 3需要设置一个范围,以查找没有关联Feed的所有作者。

class Author < ActiveRecord::Base

    has_and_belongs_to_many :feeds
    scope :without_feed, joins(:feeds).where("authors_feeds.feed_id is null")

end

......似乎不起作用。感觉就像一件简单的事情。我在这里缺少什么?

2 个答案:

答案 0 :(得分:23)

据我所知,ActiveRecord / Arel没有定义外连接的方法。因此,您必须编写比正常情况更多的SQL。这样的事情可以解决问题:

    scope :without_feed, joins('left outer join authors_feeds on authors.id=authors_feeds.author_id').where('authors_feeds.feed_id is null')

我当然在猜你的桌名和外键。但这应该会给你提供图片。

答案 1 :(得分:1)

在 Rails >= 5 中,你可以这样做:

scope :without_feed, -> {
  left_outer_joins(:feeds)
  .where(authors_feeds: { author_id: nil })
}

scope :with_feed, -> {
  left_outer_joins(:feeds)
  .where.not(authors_feeds: { author_id: nil })
}