2013-06-02 17 views

Odpowiedz

23
a.to_a - [b] 

Tło: a.to_a convertrs relacji do tablicy w pamięci.
[b] to tablica z elementem, który chcesz usunąć (w pamięci).
a.to_a - [b] dokonuje odjęcia tablicy.

(. W szynach 3,2 .to_a zastosowano automatycznie w odniesieniu, kiedy to dostęp że zgodni z gregates: lepiej do konwersji związku do tablicy pośrednio)

1

To jest to, czego potrzebujesz:

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

W twoim przypadku, nie może powrócić Model.limit(2) pierwsze dwa obiekt i tak tablica a nie może zawierać b a więc zwraca nil.

+0

widzę przedmiot dopasowanie wym w b – sangeethkumar

+0

możesz podać strukturę swojego modelu ?. Wypróbuj inny model i sprawdź, czy jest jakiś problem z twoim modelem. – itz2k13

13

Istnieje potencjalnie pewne zamieszanie, ponieważ w ActiveRecord, Model.limit(2) nie zwraca tablicy.

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

Więc kiedy zadzwonisz a.delete(b), może nie być wywołanie Array#delete.

Spróbuj zamiast:

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

fajny pomysł, aby użyć "wszystkich", aby uzyskać układ z relacji. Próbowałem i 'to_a' również działa i może być ułamek bardziej wyraźny. – semiomant

+2

'all' nie zwraca już tablicy w Railsach 4.2,' to_a' robi. –