t.belongs_to และ t.references ในรางต่างกันอย่างไร?


123

อะไรคือความแตกต่างระหว่างt.referencesและt.belongs_to? ทำไมเราถึงมีสองคำที่แตกต่างกัน? ดูเหมือนว่าสำหรับฉันพวกเขาทำสิ่งเดียวกัน? พยายามค้นหาโดย Google แต่ไม่พบคำอธิบาย

class CreateFoos < ActiveRecord::Migration
  def change
    create_table :foos do |t|
      t.references :bar
      t.belongs_to :baz
      # The two above seems to give similar results
      t.belongs_to :fooable, :polymorphic => true
      # I have not tried polymorphic with t.references
      t.timestamps
    end
  end
end

1
พวกเขาทำงานเหมือนกันนั่นเป็นสิ่งที่เลวร้ายหรือไม่? การอ้างอิงจะแทรกคอลัมน์คีย์นอกสำหรับคุณ คุณสามารถใช้ belong_to แทนเพื่อให้การย้ายข้อมูลของคุณอ่านง่ายขึ้น ดูรายละเอียดบางอย่างในguide.rubyonrails.org/migrations.html
muffinista

1
ไม่ได้บอกว่าเป็นสิ่งที่ไม่ดี เพิ่งสับสนว่าพวกเขาทำงานเหมือนกันหรือคนละแบบกันเพราะฉันไม่พบเอกสารที่ระบุว่าทำงานเหมือนกัน http://guides.rubyonrails.org/migrations.htmlยังไม่ชัดเจนในเรื่องนั้น
Tornskaden

3
สิ่งนี้มีแนวโน้มที่จะใช้เพื่อความเข้ากันได้แบบย้อนหลังเท่านั้นและreferencesจะเลิกใช้งานและนำออกในอนาคตของราง อย่าใช้คำของฉันเกี่ยวกับเรื่องนี้มันเป็นเพียงการคาดเดาที่มีการศึกษา
ช่างก่ออิฐ

"ตัวช่วยอื่น ๆ เรียกว่าการอ้างอิง (มีให้ใช้ในชื่อ belong_to) ในรูปแบบที่ง่ายที่สุดก็แค่เพิ่มความสามารถในการอ่าน" - จากคำแนะนำ
muffinista

5
นี่คือซอร์สโค้ด - เป็นของ _to เป็นนามแฝงที่ตรงของการอ้างอิงgithub.com/rails/rails/blob/…
muffinista

คำตอบ:


163

เมื่อมองไปที่ซอร์สโค้ดพวกเขาทำสิ่งเดียวกัน - belongs_toเป็นนามแฝงของreference:

  def references(*args)
    options = args.extract_options!
    polymorphic = options.delete(:polymorphic)
    args.each do |col|
      column("#{col}_id", :integer, options)
      column("#{col}_type", :string, polymorphic.is_a?(Hash) ? polymorphic : options) unless polymorphic.nil?
    end
  end
  alias :belongs_to :references

นี่เป็นเพียงวิธีหนึ่งในการทำให้โค้ดของคุณอ่านง่ายขึ้น - เป็นเรื่องดีที่สามารถใส่การbelongs_toย้ายข้อมูลได้ตามความเหมาะสมและยึดติดกับreferencesการเชื่อมโยงประเภทอื่น ๆ


ฉันสงสัยว่าพวกเขาจะเก็บไว้แบบนี้ต่อไปในอนาคตหรือพวกเขากำลังจะลบออกไป!? ฉันชอบวิธีนี้ที่สามารถเลือกได้ว่าจะให้โค้ดของฉันดูเหมือนภาษาอังกฤษจริงๆ
Tornskaden

ฉันจะเดาว่าทั้งสองอยู่ที่นี่ เมื่อดูบันทึกการกระทำมันเป็นแบบนี้มาตั้งแต่ปี 2550
muffinista

4
IMO referencesเป็นตัวเลือกที่ไม่ชัดเจนสำหรับคำศัพท์ พวกเขาเปลี่ยนชื่อbefore_filterไปbefore_actionซึ่งย้ายที่ดีเพราะมันลดความคลุมเครือ ข้อดีอย่างหนึ่งreferencesก็คือมันแตกต่างจากที่คุณใช้ในโมเดลดังนั้นคุณจะสับสนน้อยลงหากคุณอยู่ในโมเดลหรือการโยกย้าย แต่คำใด ๆ ที่แตกต่างกันจะเป็นไปตามเกณฑ์นี้
ahnbizcad

2
IMO referencesเป็นคำที่ดีกว่าในระดับฐานข้อมูล
vasilakisfil

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