2012-01-07 3 views
0

n個のモデルに関連する1の数でモデルを更新する方法間:ActiveRecordの私はn個の関係に1を持つ2つのモデルがあり

ブック1 < - > nのページ

私はすべての書籍(約300'000)の更新声明を出したい。 Bookモデルにはinteresting_pages_countという列があります。興味深い属性がtrueに設定されているすべてのPagesから要約する必要があります。

これは1つのステートメントで可能ですか?

おかげで、 Makrus

答えて

0

あなたが

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

またはプレーンなSQLクエリを試みることができます。

0

まあ、一つだけの文が本当に野心的ですが、あなたはブックモデルに、このメソッドを定義する場合:

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)} 
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; 
関連する問題