Обновить все данные модели в рельсах

Например, у нас есть:

class PublicLibrary  < ActiveRecord::Base
  has_many :books
end


class Book  < ActiveRecord::Base
  belongs_to :public_library
end

Если мы хотим обновить все книги в PublicLibrary, мы можем добавить в модель PublicLibrary

accepts_nested_attributes_for :books, :allow_destroy => true, :reject_if=>:all_blank

И теперь мы можем сделать что-то вроде этого

library=PublicLibrary.find(ID)
library.update_attributes(:books_attributes=>{<bunch of books here>})

И все связанные книги будут обновлены, некоторые книги будут удалены, а некоторые новые книги будут вставлены в настольные книги.

Теперь у меня есть модельная книга, не имеющая отношения к PublicLibrary:

class Book  < ActiveRecord::Base
end

У меня есть панель администратора, которая показывает все книги в одной большой таблице, и я хочу обновлять/удалять/вставлять новые книги одним щелчком мыши, поэтому я хочу что-то вроде

Book.bulk_update({...books...}) 

Или работать с подмножеством (не уверен, что мне это действительно нужно, но если мы можем это сделать... почему бы не знать как?)

books_to_update=Book.where(...).bulk_update({...books...})

Конечно, Book может иметь несколько вложенных моделей.

Есть ли у вас какие-либо идеи? P.S. В настоящее время у меня есть только идея иметь какого-то родителя и обновить его...


person Pavel Manylov    schedule 12.07.2011    source источник
comment
К сожалению, ActiveRecord не может делать все, и, хотя я могу ошибаться, я не думаю, что то, о чем вы просите, возможно. У меня есть собственное недовольство тем, что AR затрудняет работу с полиморфами + STI, поэтому я знаю, что вы чувствуете! Тем не менее, не должно быть слишком сложно написать некоторый код, который перебирает хеш и создает/обновляет/уничтожает по мере необходимости. Вы можете превратить его в жемчужину, расширяющую функциональность ActiveRecord.   -  person JamesDS    schedule 12.07.2011


Ответы (1)


ваш хэш {...books...} либо содержит несколько книг, для которых вы хотите

books.each { |id, book| Book.find(id).update_attributes(book) }

или вы хотите выполнить реальное массовое обновление (то есть одно и то же обновление для всех книг в действии), тогда вы можете использовать http://apidock.com/rails/ActiveRecord/Relation/update_all

person giladbu    schedule 12.07.2011
comment
Да, я это знаю. Ваше решение не делает то, что мне нужно. Мне нужно обновить+удалить+вставить разные данные в одном запросе к activeRecord (я специально показывал пример работы с вложенными атрибутами). Конечно, я могу сделать это сам, но если рельсы могут делать это для вложенных атрибутов, может быть, они могут работать с набором данных, у которых нет какого-либо родителя? - person Pavel Manylov; 12.07.2011