24

配列にアクティブなレコード オブジェクトのセットがあります。

データベースにない配列からオブジェクトを削除したいだけです

a = Model.limit(2)

b = Model.first

a.delete(b)

nil 値を返す

削除していません

とにかくありますか?

4

3 に答える 3

29
a.to_a - [b]

背景:a.to_aリレーションをメモリ内の配列に変換します。
[b]削除したい要素だけの配列です(メモリ内)。
a.to_a - [b]配列の減算を行います。

(Rails 3.2 では .to_a はアクセス時にリレーションに自動的に適用されました。同意gregates: リレーションを明示的に配列に変換する方がよい)

于 2013-06-02T15:05:30.083 に答える
15

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)
于 2013-06-02T15:01:59.953 に答える
4

これはあなたが必要とするものです:

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

于 2013-06-02T14:47:19.650 に答える