Как удалить активный объект записи из массива
У меня есть набор активных объектов записи в массиве.
Я просто хочу удалить объект из массива не в базе данных
a = Model.limit(2)
b = Model.first
a.delete(b)
возвращающее значение nil
Не удаляет
в любом случае?
Ответы
Ответ 1
a.to_a - [b]
Фон: a.to_a
преобразует отношение в массив в памяти.
[b]
- это массив с только элементом, который вы хотите удалить (в памяти).
a.to_a - [b]
выполняет подстановку массива.
(В Rails 3.2.to_a автоматически применяется к отношению при обращении к нему. Я согласен с gregates
: лучше преобразовать отношение в массив явно)
Ответ 2
Здесь потенциально некоторая путаница, потому что в ActiveRecord
, Model.limit(2)
не возвращает массив.
Model.limit(2).class #=> ActiveRecordRelation
Поэтому, когда вы вызываете a.delete(b)
, вы не можете вызывать Array#delete
.
Попробуйте это вместо:
a = Model.limit(2).to_a # Executes the query and returns an array
b = Model.first
a.delete(b)
Ответ 3
Это то, что вам нужно:
objects_in_db = Model.all
objects_in_array = Model.first(2)
objects_in_array.delete_if { |obj| !objects_in_db.include?(obj)}
В вашем случае Model.limit(2)
может не возвращать первые два объекта, поэтому массив a
может не содержать b
и, следовательно, он возвращает nil
.