2013-06-02 4 views

ответ

23
a.to_a - [b] 

фона: a.to_a convertrs соотношению в массив в памяти.
[b] - это массив с только элементом, который вы хотите удалить (в памяти).
a.to_a - [b] выполняет деление массива.

(. В Rails 3.2 .to_a была применена автоматически в зависимости, когда он был доступ, я согласен с gregates: Лучше преобразовать отношение к массиву в явном виде)

1

Это то, что вам нужно:

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.

+0

я могу увидеть соответствующий объект каф в б – sangeethkumar

+0

Можете ли вы предоставить структуру вашей модели ?. Попробуйте использовать другую модель и посмотрите, есть ли какие-либо проблемы с вашей моделью. – itz2k13

13

Здесь есть потенциальная путаница, потому что в 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) 
+0

Приятная идея использовать 'all', чтобы получить массив из отношения. Я попробовал и 'to_a' также работает и может быть более явным. – semiomant

+2

'all' больше не возвращает массив в Rails 4.2,' to_a' делает. –

Смежные вопросы