1

我想要一个范围,它会返回一个列表(例如)他们有章节的书籍。我找到了这篇文章

它帮助我选择有章节的书籍。但是,如果我想选择那些他们没有章节的人,例如:

    class Book
      scope :long, joins(:chapters).
        select('books.id, count(chapters.id) as n_chapters').
        group('books.id').
        having('n_chapters = 0')
    end

这个范围没有给我任何回报。你能帮我吗?

4

1 回答 1

2

使用joins导致与已经有连接的所有书籍+章节组合创建关系。这是通过INNER JOINSQL 子句完成的。如果要OUTER JOIN创建所有可能的组合(包括书籍+无效章节),则必须进行。

代替

joins(:chapters).

joins('LEFT OUTER JOIN chapters ON books.id=chapters.book_id').

在这种情况下,请考虑改用NOT INSQL 子句。像这儿:

scope :long, lambda { where('id NOT IN (%s)' % Chapter.select(:book_id).to_sql) }

它是相当小/更快且更具可读性/可维护性的结构。

于 2012-09-07T16:30:32.707 回答