n個のモデルに関連する1の数でモデルを更新する方法間:ActiveRecordの私はn個の関係に1を持つ2つのモデルがあり
ブック1 < - > nのページ
私はすべての書籍(約300'000)の更新声明を出したい。 Bookモデルにはinteresting_pages_countという列があります。興味深い属性がtrueに設定されているすべてのPagesから要約する必要があります。
これは1つのステートメントで可能ですか?
おかげで、 Makrus
n個のモデルに関連する1の数でモデルを更新する方法間:ActiveRecordの私はn個の関係に1を持つ2つのモデルがあり
ブック1 < - > nのページ
私はすべての書籍(約300'000)の更新声明を出したい。 Bookモデルにはinteresting_pages_countという列があります。興味深い属性がtrueに設定されているすべてのPagesから要約する必要があります。
これは1つのステートメントで可能ですか?
おかげで、 Makrus
あなたが
Book.update_all({:field => value}, where_condition)
またはプレーンなSQLクエリを試みることができます。
まあ、一つだけの文が本当に野心的ですが、あなたはブックモデルに、このメソッドを定義する場合:
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)}
ことが可能であり、少なくとも、 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;