ActiveRecord tìm và chỉ trả về các cột đã chọn


89

chỉnh sửa 2

Nếu bạn tình cờ gặp phải điều này, hãy kiểm tra cả hai câu trả lời vì bây giờ tôi sử dụng pluck cho điều này


Tôi có một tập dữ liệu tùy chỉnh khá lớn mà tôi muốn quay lại để được lặp lại dưới dạng json. Một phần là:

l=Location.find(row.id)
tmp[row.id]=l

nhưng tôi muốn làm điều gì đó như:

l=Location.find(row.id).select("name, website, city")
tmp[row.id]=l

nhưng điều này dường như không hoạt động. Làm thế nào tôi sẽ làm cho nó hoạt động?

cám ơn

chỉnh sửa 1
cách khác, có cách nào để tôi có thể chuyển một mảng chỉ gồm các thuộc tính mà tôi muốn đưa vào không?

Câu trả lời:


86

Trong Rails 2

l = Location.find(:id => id, :select => "name, website, city", :limit => 1)

...hoặc là...

l = Location.find_by_sql(:conditions => ["SELECT name, website, city FROM locations WHERE id = ? LIMIT 1", id])

Tài liệu tham khảo này cung cấp cho bạn toàn bộ danh sách các tùy chọn mà bạn có thể sử dụng .find, bao gồm cách giới hạn theo số, id hoặc bất kỳ cột / ràng buộc tùy ý nào khác.

Trong Rails 3 w / Giao diện truy vấn ActiveRecord

l = Location.where(["id = ?", id]).select("name, website, city").first

Tham khảo: Giao diện Truy vấn Bản ghi Hoạt động

Bạn cũng có thể hoán đổi thứ tự của các lệnh gọi chuỗi này, thực hiện .select(...).where(...).first- tất cả các lệnh gọi này là xây dựng truy vấn SQL và sau đó gửi đi.


nhưng tôi chỉ muốn có một trường hợp duy nhất không phải tất cả
timpone

Tôi đã chỉnh sửa câu trả lời của mình. :limitnên làm điều này, hoặc :firsthoặc :lasthoặc bất cứ điều gì, tùy thuộc vào những gì bạn muốn. Tài liệu tham khảo mà tôi đã liên kết sẽ cho bạn biết cách thực hiện tất cả những điều đó.
jefflunt

Cập nhật để bao gồm làm thế nào để làm một truy vấn tương đương trong Rails 3.
jefflunt

205

gảy (tên_cột)

Phương thức này được thiết kế để thực hiện chọn theo một cột duy nhất dưới dạng truy vấn SQL trực tiếp Trả về Mảng với các giá trị của tên cột đã chỉ định Các giá trị có cùng kiểu dữ liệu với cột.

Ví dụ:

Person.pluck(:id) # SELECT people.id FROM people
Person.uniq.pluck(:role) # SELECT DISTINCT role FROM people
Person.where(:confirmed => true).limit(5).pluck(:id)

xem http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-pluck

Các đường ray được giới thiệu từ 3.2 trở đi và chỉ chấp nhận một cột duy nhất. Trong rails 4, nó chấp nhận nhiều cột


1
OK, gảy với nhiều cột thật tuyệt vời .. chỉ cần học được điều đó trên câu trả lời này. Rails 3 mặc dù cần câu trả lời được chấp nhận.
Jay Shepherd

Câu trả lời được chấp nhận là đúng vì lúc đó không có gảy.
prasad.surase

User.pluck (: email,: id) SELECT "người sử dụng" "email", "sử dụng" "id" TỪ "người sử dụng"..
Pranav Prashant

2
Model.uniq hiện là Model.distinction (ít nhất là trong Rails 5).
mrturtle

Dường như bạn có thể làm những điều sau đây trong đường ray 3.2: Location.select([:name, :website, :city])nếu bạn vượt qua nó một mảng
CTS_AE

24

Câu trả lời của tôi đến khá muộn vì tôi là một nhà phát triển khá mới. Đây là những gì bạn có thể làm:

Location.select(:name, :website, :city).find(row.id)

Btw, đây là Rails 4


Đây phải là câu trả lời được chọn và trả lời trực tiếp nhất câu hỏi.
Michael Wiltbank
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.