Подтвердить что ты не робот

Как удалить активный объект записи из массива

У меня есть набор активных объектов записи в массиве.

Я просто хочу удалить объект из массива не в базе данных

a = Model.limit(2)

b = Model.first

a.delete(b)

возвращающее значение nil

Не удаляет

в любом случае?

4b9b3361

Ответ 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.