วิธีรับการเชื่อมโยง activerecord ผ่านการไตร่ตรอง

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

class Post
  has_many :comments, :foreign_key => :message_id # this is a contrived example
end

ถ้าฉันทำ Post.column_names ฉันจะได้ที่ message_id แต่มีวิธีใดบ้างที่จะได้ comments


person Matt Briggs    schedule 13.11.2010    source แหล่งที่มา


คำตอบ (3)


Model.reflections ให้ข้อมูลเกี่ยวกับการเชื่อมโยงของโมเดล โดยมีคีย์ Hash อยู่ที่ชื่อการเชื่อมโยง เช่น.

Post.reflections.keys # => ["comments"]

นี่คือตัวอย่างข้อมูลบางส่วนที่สามารถใช้เพื่อเข้าถึง:

Post.reflections["comments"].table_name # => "comments"
Post.reflections["comments"].macro # => :has_many
Post.reflections["comments"].foreign_key # => "message_id"

หมายเหตุ: คำตอบนี้ได้รับการอัปเดตให้ครอบคลุม Rails 4.2 ตามคำตอบของ MCB และ ความคิดเห็นด้านล่าง ใน Rails เวอร์ชันก่อนหน้านี้ foreign_key ของการสะท้อนกลับถูกเข้าถึงโดยใช้ primary_key_name แทน และคีย์สำหรับการสะท้อนอาจเป็นสัญลักษณ์แทนสตริง ขึ้นอยู่กับวิธีกำหนดการเชื่อมโยง เช่น :comments แทนที่จะเป็น "comments"

person mikej    schedule 13.11.2010
comment
โปรดทราบว่าการไตร่ตรองเพียงส่งคืนแฮช ไม่ใช่ HashWithIndifferentAccess ดังนั้นคีย์ของแฮช .reflections จะเป็นสัญลักษณ์หรือสตริง ขึ้นอยู่กับสิ่งที่กล่าวไว้ในคำจำกัดความของโมเดล นี่ทำให้ฉันสะดุดคิดว่ามันจะเป็นอย่างใดอย่างหนึ่งหรือ - person taelor; 02.04.2012
comment
ดังที่ MCB พูดในคำตอบของเขาใน Rails 4.2 คุณพูดว่า Post.reflections["comments"]instead - person Asfand Qazi; 10.04.2015
comment
ขอบคุณ @AsfandYarQazi - ฉันได้อัปเดตคำตอบเพื่อรวมความแตกต่างสำหรับ Rails 4.2+ - person mikej; 12.04.2015
comment
คำตอบของคุณช่วยฉันปรับปรุงการรวบรวมข้อมูลเกี่ยวกับฐานข้อมูล Rails: gist.github.com/r72cccp/3480f4e13f00d54d4cb87bfd4077c8aa - person Sergio Belevskij; 20.08.2016

สำหรับ Googler ในอนาคตใน Rails 4 คำตอบจะเป็น:

Post.reflections[:comments].foreign_key # => "message_id"

นำมาจากที่นี่: https://stackoverflow.com/a/15364743/2167965

แก้ไข:

reflections ในเวอร์ชัน 4.2 ตอนนี้ใช้สตริงแทนสัญลักษณ์ ซึ่งเป็นจุดบกพร่องที่น่าติดตาม หากคุณต้องการใช้สัญลักษณ์ต่อไป คุณควรสลับไปที่ reflect_on_association(:assoc_name) นอกจากนี้ หมายเหตุ reflections จริงๆ แล้วเป็น api สาธารณะ ซึ่งจะรายงานสิ่งต่าง ๆ เช่น HABTM แม้ว่า ทุกอย่างมีหลายอย่างซ่อนอยู่ การสะท้อนที่ Rails ใช้จริงตอนนี้อยู่ใน _reflections

person MCB    schedule 03.01.2014

สำหรับวัตถุ ActiveRecord ฉันใช้:

object._reflections

ดังนั้นฉันสามารถจัดการแฮชที่กลับมาได้ ตัวอย่างเช่น:

object._reflections.keys.each do |key|
    object.public_send(key).destroy_all
end

ตัวอย่างข้างต้นลบความสัมพันธ์ทั้งหมดออกจากฐานข้อมูล

person Lucivaldo Castro    schedule 09.03.2016
comment
ไม่แนะนำให้ใช้วิธีการที่ขีดเส้นใต้บน Rails เนื่องจากอาจเปลี่ยนแปลงได้ตลอดเวลาโดยไม่มีการเตือนล่วงหน้า ซึ่งจะทำให้เกิดข้อผิดพลาดเมื่ออัปเกรด - person camilo.forero; 18.10.2019