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

时间:2015-08-28 20:32:36

标签: sql ruby-on-rails

我想做类似"查找所有书籍book.pages.count< books.max_pages&#34 ;.

所以模型是:

class Book
  has_many :pages
end

class Page
  belongs_to :book
end

我知道我可以找到具有一定数量页面的书籍。例如:

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

有一个很好的方法来实现动态页面计数吗?例如:

Book.joins(:pages).group("books.id").select(.having("count(pages.id) <= book.max_pages")

如果不是,我总是可以只在Book模型中存储一些内容(例如book.is_full = false,直到保存导致它已满),但如果max_pages更新,这就不那么灵活了。

2 个答案:

答案 0 :(得分:2)

使用counter_cache!

http://guides.rubyonrails.org/association_basics.html 4.1.2.3:counter_cache

答案 1 :(得分:2)

您可以创建这样的范围:

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

<强>更新

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

def self.page_count_under_max
  joins(:pages)
    .group('books.id')
    .having('COUNT(pages.id) < books.max_pages')
end