Đây là hai mã mẫu.
Người đầu tiên với collect
:
User.first.gifts.collect(&:id)
Cái thứ hai với pluck
:
User.first.gifts.pluck(:id)
Có sự khác biệt nào giữa chúng về hiệu suất hay điều gì khác không?
Đây là hai mã mẫu.
Người đầu tiên với collect
:
User.first.gifts.collect(&:id)
Cái thứ hai với pluck
:
User.first.gifts.pluck(:id)
Có sự khác biệt nào giữa chúng về hiệu suất hay điều gì khác không?
Câu trả lời:
pluck
ở mức db. Nó sẽ chỉ truy vấn trường cụ thể. Xem này .
Khi bạn làm:
User.first.gifts.collect(&:id)
Bạn có các đối tượng với tất cả các trường được tải và bạn chỉ cần nhận được id
nhờ vào phương pháp dựa trên Enumerable.
Vì thế:
nếu bạn chỉ cần id
với Rails 4, hãy sử dụng ids
:User.first.gifts.ids
nếu bạn chỉ cần một số trường với Rails 4, hãy sử dụng pluck
:User.first.gifts.pluck(:id, :name, ...)
nếu bạn chỉ cần một trường với Rails 3, hãy sử dụng pluck
:User.first.gifts.pluck(:id)
nếu bạn cần tất cả các trường, hãy sử dụngcollect
nếu bạn cần một số trường với Rails 4, vẫn sử dụng pluck
nếu bạn cần một số trường với Rails 3, hãy sử dụng select
vàcollect
pluck
ing nhiều lĩnh vực, Rails 3 không, trừ khi bạn sử dụng workaround Ryan Lefevre của
id
, hãy sử dụng .ids
tài liệu Tham khảo: api.rubyonrails.org/classes/ActiveRecord/…
Đúng. Theo hướng dẫn của Rails , pluck
chuyển đổi trực tiếp kết quả cơ sở dữ liệu thành một đối tượng array
mà không cần xây dựng ActiveRecord
. Điều này có nghĩa là hiệu suất tốt hơn cho một truy vấn lớn hoặc thường chạy.
Ngoài câu trả lời của @ apneadiving, pluck
có thể lấy cả tên cột và tên cột làm đối số:
Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
Nếu có trường hợp bạn đang sử dụng ít thuộc tính của bản ghi đã truy xuất. Trong những trường hợp như vậy bạn nên sử dụng pluck
.
User.collect(&:email)
Trong ví dụ trên nếu bạn chỉ cần thuộc tính email hơn là bạn đang lãng phí bộ nhớ và thời gian. Bởi vì nó sẽ truy xuất tất cả các cột từ bảng người dùng trong cơ sở dữ liệu, phân bổ bộ nhớ cho từng thuộc tính (bao gồm cả những thuộc tính mà bạn sẽ không bao giờ sử dụng)
LƯU Ý: pluck
không trả về ActiveRecord_Relation của người dùng
pluck
với nhiều thuộc tính, như thếpluck(:id, :name)
nào?