ActiveRecord, как обновить модель со счетчиком связанной с 1 по n модели - PullRequest
0 голосов
/ 07 января 2012

У меня есть две модели с отношением 1 к n между ними:

Книга 1 <-> n Страница

Я хочу сделать заявление об обновлении всех Книг (около 300 000). Модель Book имеет столбец интересно_страницы_счет, в котором необходимо суммировать все страницы, для которых интересный атрибут имеет значение true.

Возможно ли это в одном утверждении?

Спасибо, Makrus

Ответы [ 3 ]

1 голос
/ 07 января 2012

Это возможно, по крайней мере, в 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;
0 голосов
/ 07 января 2012

Хорошо, только одно утверждение действительно амбициозно, но если вы определите этот метод в своей модели 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)}
0 голосов
/ 07 января 2012

Вы можете попробовать с

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

или с простым запросом SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...