配列にアクティブなレコード オブジェクトのセットがあります。
データベースにない配列からオブジェクトを削除したいだけです
a = Model.limit(2)
b = Model.first
a.delete(b)
nil 値を返す
削除していません
とにかくありますか?
配列にアクティブなレコード オブジェクトのセットがあります。
データベースにない配列からオブジェクトを削除したいだけです
a = Model.limit(2)
b = Model.first
a.delete(b)
nil 値を返す
削除していません
とにかくありますか?
a.to_a - [b]
背景:a.to_a
リレーションをメモリ内の配列に変換します。
[b]
削除したい要素だけの配列です(メモリ内)。
a.to_a - [b]
配列の減算を行います。
(Rails 3.2 では .to_a はアクセス時にリレーションに自動的に適用されました。同意gregates
: リレーションを明示的に配列に変換する方がよい)
inは配列を返さないため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)
これはあなたが必要とするものです:
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)
最初の2つのオブジェクトを返さない可能性があるため、配列a
に含まれていない可能性があるb
ため、 を返しますnil
。