ActiveRecord如何使用相关的1到n模型的计数来更新模型

时间:2012-01-07 15:32:20

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有两个模型之间有1到n的关系:

  

第1册< - > n页

我想对所有图书(约300'000)进行更新声明。 Book模型有一列interesting_pages_count,需要将所有有趣属性设置为true的页面汇总。

这是否可以在一个声明中使用?

谢谢, Makrus

3 个答案:

答案 0 :(得分:1)

至少在PostgreSQL中是可能的:

UPDATE books SET interesting_pages_count = (
  SELECT count(*) FROM pages WHERE pages.book_id = books.id AND interesting = true
) FROM pages WHERE books.id = pages.book_id;

答案 1 :(得分:0)

您可以尝试使用

Book.update_all({:field => value}, where_condition)

或使用纯SQL查询。

答案 2 :(得分:0)

嗯,只有一个声明真的雄心勃勃,但如果你在Book模型上定义这个方法:

def count_interesting_pages
  self.pages.inject(0) { |result, page| result += 1 if page.interesting?}
end

然后你可以这样做:

Book.all.each {|b| b.update_attribute(:interesting_pages, count_interesting_pages)}