2013-06-02 8 views

Antwort

23
a.to_a - [b] 

Hintergrund: a.to_a convertrs die Beziehung in eine Anordnung in im Speicher.
[b] ist ein Array mit nur dem Element, das Sie löschen möchten (im Speicher).
a.to_a - [b] macht eine Array-Subtraktion.

(. In Rails 3.2 .to_a wurde automatisch auf eine Beziehung angewendet, wenn auf sie zugegriffen wurde ich stimme gregates: Es ist besser, die Beziehung auf ein Array explizit zu konvertieren)

1

ist, was Sie brauchen:

objects_in_db = Model.all 
objects_in_array = Model.first(2) 
objects_in_array.delete_if { |obj| !objects_in_db.include?(obj)} 

In Ihrem Fall Model.limit(2) kann die ersten beiden Objekte nicht zurück und so das Array a nicht b enthalten und daher kehrt nil.

+0

i das passende Objekt sehen kann, ist Erfolg in b – sangeethkumar

+0

können Sie die Struktur Ihres Modells angeben ?. Versuchen Sie es mit einem anderen Modell und prüfen Sie, ob ein Problem mit Ihrem Modell vorliegt. – itz2k13

13

Es gibt möglicherweise einige Verwirrung hier, weil in ActiveRecord, Model.limit(2) kein Array zurückgibt. So

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

wenn Sie a.delete(b) nennen, können Sie nicht Array#delete fordern werden.

diese stattdessen versuchen:

a = Model.limit(2).to_a # Executes the query and returns an array 
b = Model.first 
a.delete(b) 
+0

nette Idee, 'all' zu verwenden, um ein Array aus der Relation zu bekommen. Ich habe versucht und 'to_a' funktioniert auch und könnte ein Bruchteil expliziter sein. – semiomant

+2

'all' gibt in Rails 4.2 kein Array mehr zurück,' to_a' tut dies. –

Verwandte Themen