Oto dwa przykładowe kody.
Pierwsza z collect
:
User.first.gifts.collect(&:id)
Drugi z pluck
:
User.first.gifts.pluck(:id)
Czy jest jakaś różnica między nimi w działaniu, czy coś innego?
Oto dwa przykładowe kody.
Pierwsza z collect
:
User.first.gifts.collect(&:id)
Drugi z pluck
:
User.first.gifts.pluck(:id)
Czy jest jakaś różnica między nimi w działaniu, czy coś innego?
Odpowiedzi:
pluck
jest na poziomie db. Będzie sprawdzać tylko określone pole. Zobacz to .
Kiedy robisz:
User.first.gifts.collect(&:id)
Masz obiekty z załadowanymi wszystkimi polami i po prostu otrzymujesz id
podziękowania dzięki metodzie opartej na Enumerable.
Więc:
jeśli potrzebujesz tylkoid
z Rails 4, użyj ids
:User.first.gifts.ids
jeśli potrzebujesz tylko niektórych pól w Rails 4, użyj pluck
:User.first.gifts.pluck(:id, :name, ...)
jeśli potrzebujesz tylko jednego pola z Rails 3, użyj pluck
:User.first.gifts.pluck(:id)
jeśli potrzebujesz wszystkich pól, użyjcollect
jeśli potrzebujesz pól w Rails 4, nadal używaj pluck
jeśli potrzebujesz pól z Railsami 3, użyj select
icollect
pluck
wiele pól, Rails 3 nie, chyba że użyjesz obejścia Ryana
id
, użyj .ids
Ref doc: api.rubyonrails.org/classes/ActiveRecord/…
Tak. Zgodnie z przewodnikami Railsów , pluck
bezpośrednio konwertuje wynik bazy danych na plik array
, bez konstruowania ActiveRecord
obiektów. Oznacza to lepszą wydajność w przypadku dużych lub często wykonywanych zapytań.
Oprócz odpowiedzi @ apneadiving pluck
jako argument może przyjmować zarówno nazwy jednej, jak i wielu kolumn:
Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
Jeśli jest przypadek, w którym używasz kilku atrybutów pobranego rekordu. W takich przypadkach powinieneś użyć pluck
.
User.collect(&:email)
W powyższym przykładzie, jeśli potrzebujesz tylko atrybutu e-mail, to marnujesz pamięć i czas. Ponieważ pobierze wszystkie kolumny z tabeli użytkowników w bazie danych, przydziela pamięć dla każdego atrybutu (w tym atrybutów, których nigdy nie użyjesz)
UWAGA: pluck
nie zwraca ActiveRecord_Relation użytkownika
pluck
wielu atrybutów, na przykładpluck(:id, :name)
?