Ruby on rails 带交叉连接的高级Rails 3范围

Ruby on rails 带交叉连接的高级Rails 3范围,ruby-on-rails,join,scope,Ruby On Rails,Join,Scope,我想要一个示波器,它能给我一个他们有章节的书的列表。我找到了 它帮助我选择有章节的书。但是如果我想选择那些没有章节的,比如: class Book scope :long, joins(:chapters). select('books.id, count(chapters.id) as n_chapters'). group('books.id'). having('n_chapters = 0') end 这个范围

我想要一个示波器,它能给我一个他们有章节的书的列表。我找到了

它帮助我选择有章节的书。但是如果我想选择那些没有章节的,比如:

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

这个范围不返回任何内容。你能帮我一个忙吗?

使用
连接
可以创建与所有已经有连接的书籍+章节的组合的关系。这是通过vie
internaljoin
SQL子句完成的。如果希望创建所有可能的组合(包括书本+无效章节),则必须进行
外部联接

替换

joins(:chapters).

<强>但在此情况下考虑使用<代码>而不是< /COD> SQL子句。就像这里:

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

它的结构更小/更快,可读性和可维护性更强。

好家伙!这两种解决方案都非常有效。我很高兴能得到这么快和有能力的帮助。祝你周末愉快;)
scope :long, lambda { where('id NOT IN (%s)' % Chapter.select(:book_id).to_sql) }