【问题标题】:Advanced Rails 3 scope with CROSS JOIN具有 CROSS JOIN 的高级 Rails 3 范围
【发布时间】:2012-09-01 12:59:49
【问题描述】:

我想要一个范围,它可以返回一个列表(例如)他们有章节的书籍。我找到了this post

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

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

这个范围什么也没给我。你能帮帮我吗?

【问题讨论】:

    标签: ruby-on-rails join scope


    【解决方案1】:

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

    替换

    joins(:chapters).
    

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

    但是在这种情况下考虑改用NOT IN SQL 子句。喜欢这里:

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

    它的结构更小/更快,更易读/可维护。

    【讨论】:

    • 好兄弟!这两种解决方案都运行良好。我对这种快速而有能力的帮助感到非常高兴。祝你周末愉快;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多