Как назначить несколько атрибутов в массив ActiveRecord :: Relation за один шаг? - PullRequest
2 голосов
/ 17 октября 2019

Существует функция rails для присвоения атрибутов экземпляру модели ActiveRecord (отдельная запись) без сохранения (или обновления).

Например:

$> post = Post.last #=> #<Post id: 53, title: 'Alpha', user_id: 39, state: 'published'>
$> post.assign_attributes(state: 'pending') #=> nil
$> post #=> #<Post id: 53, title: 'Alpha', user_id: 39, state: 'pending'>

но отправлятьне сохраняется в БД.

То же самое я хочу сделать с несколькими записями ActiveRecord::Relation.

Например:

$> posts = Post.where(state: 'published')
#=> #<ActiveRecord::Relation [#<Post id: 50, title: 'Wonderful', user_id: 39, state: 'published'>, #<Post id: 53, title: 'Alpha', user_id: 39, state: 'published'>]>
$> posts.assign_attributes(state: 'pending') #=> nil
$> posts
#=> #<ActiveRecord::Relation [#<Post id: 50, title: 'Wonderful', user_id: 39, state: 'pending'>, #<Post id: 53, title: 'Alpha', user_id: 39, state: 'pending'>]>

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Вы не можете выполнять массовое назначение в рельсах, подобных этому

posts.each {|post| post.assign_attributes(state: 'pending')}

each выполнять операции и не изменять характер для posts. Таким образом, posts будет ActiveRecord::Relation объектом.

1 голос
/ 17 октября 2019

Когда вы используете Post.update_all, это особенное, потому что он запускает оператор SQL UPDATE ALL в базе данных. Поэтому нет необходимости перебирать коллекцию в памяти.

Обновление всех записей в памяти ruby, с другой стороны, не может этого сделать;вам нужно перебрать их:

posts.each { |post| post.assign_attributes(state: 'pending') }

Однако это не должно быть проблемой. Я не могу представить ни одного сценария, в котором вы захотите обновить коллекцию объектов в памяти , не желая в какой-то момент итерировать их.

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