Rails 4 - 对关联计数的查询大于属性

jon*_*oun 3 sql ruby-on-rails

我想做类似“查找 book.pages.count < books.max_pages 的所有书籍”之类的操作。

所以模型是:

class Book
  has_many :pages
end

class Page
  belongs_to :book
end
Run Code Online (Sandbox Code Playgroud)

我知道我可以找到有固定页数的书。例如:

# Get books w/ < 5 pages.
Book.joins(:pages).group("books.id").having("count(pages.id) < ?", 5)
Run Code Online (Sandbox Code Playgroud)

有没有一种使用动态页数来做到这一点的好方法?例如:

Book.joins(:pages).group("books.id").select(.having("count(pages.id) <= book.max_pages")
Run Code Online (Sandbox Code Playgroud)

如果不是,我总是可以在 Book 模型中存储一些东西(例如,book.is_full = false直到保存导致它已满),但是如果 max_pages 更新,这会不太灵活。

dho*_*uty 5

您可以创建这样的范围:

def self.page_count_under(amount)
  joins(:pages)
    .group('books.id')
    .having('COUNT(pages.id) < ?', amount)
end
Run Code Online (Sandbox Code Playgroud)

更新

如果max_pagesBook模型的属性,这应该有效。

def self.page_count_under_max
  joins(:pages)
    .group('books.id')
    .having('COUNT(pages.id) < books.max_pages')
end
Run Code Online (Sandbox Code Playgroud)