ActiveRecord ค้นหาและส่งคืนเฉพาะคอลัมน์ที่เลือก


91

แก้ไข 2

หากคุณสะดุดในสิ่งนี้ให้ตรวจสอบคำตอบทั้งสองข้อเนื่องจากตอนนี้ฉันใช้ถอนสำหรับสิ่งนี้


ฉันมีชุดข้อมูลที่กำหนดเองขนาดใหญ่พอสมควรซึ่งฉันต้องการกลับมาเป็น echoe'd เป็น json ส่วนหนึ่งคือ:

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

แต่ฉันต้องการทำสิ่งที่ชอบ:

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

แต่ดูเหมือนจะไม่ได้ผล ฉันจะทำงานนี้ได้อย่างไร

ขอบคุณ

แก้ไข 1
หรือมีวิธีที่ฉันสามารถส่งอาร์เรย์เฉพาะแอตทริบิวต์ที่ฉันต้องการรวม?

คำตอบ:


87

ใน Rails 2

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

...หรือ...

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

เอกสารอ้างอิงนี้ให้รายการตัวเลือกทั้งหมดที่คุณสามารถใช้ได้.findรวมถึงวิธี จำกัด ตามหมายเลขรหัสหรือคอลัมน์ / ข้อ จำกัด อื่น ๆ ตามอำเภอใจ

ใน Rails 3 w / ActiveRecord Query Interface

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

Ref: Active Record Query Interface

นอกจากนี้คุณยังสามารถสลับลำดับของการโทรที่ถูกล่ามโซ่เหล่านี้ได้โดยการเรียก.select(...).where(...).firstทั้งหมดนี้คือสร้างคิวรี SQL แล้วส่งออกไป


แต่ฉันต้องการเพียงอินสแตนซ์เดียวเท่านั้นไม่ใช่ทั้งหมด
timpone

ฉันแก้ไขคำตอบของฉัน :limitควรทำสิ่งนี้หรือ:firstหรือ:lastหรืออะไรก็ได้ขึ้นอยู่กับสิ่งที่คุณต้องการ เอกสารอ้างอิงที่ฉันเชื่อมโยงจะบอกวิธีทำทั้งหมดนั้น
jefflunt

อัปเดตเพื่อรวมวิธีการทำแบบสอบถามเทียบเท่าใน Rails 3
jefflunt

206

ถอน (column_name)

วิธีนี้ได้รับการออกแบบมาเพื่อดำเนินการเลือกโดยคอลัมน์เดียวเป็นแบบสอบถาม SQL โดยตรงส่งคืนอาร์เรย์ด้วยค่าของชื่อคอลัมน์ที่ระบุค่ามีชนิดข้อมูลเหมือนกับคอลัมน์

ตัวอย่าง:

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)

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

แนะนำราง 3.2 เป็นต้นไปและยอมรับเสาเดียวเท่านั้น ในราง 4 รับหลายคอลัมน์


1
ตกลงถอนด้วยหลายคอลัมน์น่ากลัว .. เพิ่งเรียนรู้คำตอบนี้ Rails 3 แม้ว่าต้องการคำตอบที่ยอมรับ
Jay Shepherd

คำตอบที่ได้รับการยอมรับนั้นถูกต้องทำให้ตอนนั้นไม่สามารถถอนขนได้
prasad.surase

User.pluck (: email,: id) SELECT "users". "email", "users". "id" FROM "users"
pranav prashant

2
Model.uniq ตอนนี้ Model.distinct (อย่างน้อยใน Rails 5)
mrturtle

ดูเหมือนว่าคุณสามารถทำสิ่งต่อไปนี้ในราง 3.2: Location.select([:name, :website, :city])ถ้าคุณส่งอาร์เรย์
CTS_AE

27

คำตอบของฉันค่อนข้างช้าเพราะฉันเป็นนักพัฒนาหน้าใหม่ นี่คือสิ่งที่คุณทำได้:

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

Btw นี่คือRails 4


นี่ควรเป็นคำตอบที่เลือกไว้และตอบคำถามได้ตรงประเด็นที่สุด
Michael Wiltbank
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.