2013-06-02 11 views
20

アクティブレコードオブジェクトを配列に設定しました。アクティブレコードオブジェクトを配列から削除する方法

私はちょうどいないデータベース

a = Model.limit(2) 

b = Model.first 

a.delete(b) 

返すnilの値で配列からオブジェクトを削除したい

とにかく

その存在しているの削除ではない

?あなたのケースでは

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つのオブジェクトを返さない可能性がありますので、配列abが含まれない可能性があり、したがって、それはnilを返します。

答えて

23
a.to_a - [b] 

背景:a.to_a convertrsメモリ内での配列に関係します。
[b]は、要素だけの配列であり、(メモリ内で)削除したいです。
a.to_a - [b]は、配列の減算を行います。

(。Railsでは3.2 .to_aは、それがアクセスした関係に自動的に適用された私はgregatesに同意する:それは明示的に配列に関係を変換する方が良いでしょう)

1

これは、何が必要です。

+0

iが一致するオブジェクトを見ることができるが、Bで無駄です – sangeethkumar

+0

あなたはあなたのモデルの構造を提供できますか?他のモデルを試して、モデルに問題がないかどうかを確認してください。 – itz2k13

13

ActiveRecordModel.limit(2)に配列が返されない可能性があるため、混乱が生じる可能性があります。あなたがa.delete(b)を呼び出すとき

Model.limit(2).class #=> ActiveRecordRelation 

だから、あなたは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'はそうです。 –

関連する問題