Sự khác biệt giữa t.belongs_to và t.references trong đường ray là gì?


123

Sự khác biệt giữa t.referencesvà là t.belongs_togì? Tại sao chúng ta có hai từ khác nhau? Dường như với tôi họ làm điều tương tự? Đã thử một số tìm kiếm Google, nhưng không tìm thấy lời giải thích.

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
Họ làm việc như nhau - đó có phải là một điều xấu? tài liệu tham khảo chèn một cột khóa ngoại cho bạn. Thay vào đó, bạn có thể sử dụng poss_to để di chuyển dễ đọc hơn. Xem hướng dẫn.rubyonrails.org/migations.html để biết một số chi tiết.
muffinista

1
Không nói đó là một điều xấu. Chỉ bị nhầm lẫn về việc họ làm việc giống nhau hoặc theo những cách khác nhau, vì tôi không thể tìm thấy tài liệu cụ thể nào nói rằng họ làm việc như nhau. http://guides.rubyonrails.org/migations.html cũng không rõ ràng về vấn đề đó.
Tornskaden

3
Điều này có thể chỉ là để tương thích ngược và referencessẽ không được chấp nhận và loại bỏ trong bản phát hành đường ray trong tương lai. Đừng hiểu ý tôi, đây chỉ là một phỏng đoán có giáo dục.
thợ nề

"Người trợ giúp khác được gọi là tài liệu tham khảo (cũng có sẵn như thuộc về). Ở dạng đơn giản nhất, nó chỉ cần thêm một số khả năng đọc" - từ hướng dẫn
muffinista

5
Ngoài ra đây là mã nguồn - poss_to là một bí danh trực tiếp của tài liệu tham khảo github.com/rails/rails/blob/
mẹo

Câu trả lời:


161

Nhìn vào mã nguồn , họ làm điều tương tự chính xác - belongs_tolà một bí danh của 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

Đây chỉ là một cách để làm cho mã của bạn dễ đọc hơn - thật tuyệt khi có thể đưa belongs_tovào các lần di chuyển của bạn khi thích hợp và gắn bó referencesvới các loại liên kết khác.


Tôi tự hỏi liệu họ sẽ giữ nó như thế này trong tương lai hay họ sẽ loại bỏ một trong số họ!? Tôi thích nó theo cách này, có thể chọn bất cứ điều gì làm cho mã của tôi trông giống như tiếng Anh thực sự.
Tornskaden

Tôi đoán rằng cả hai đều ở đây. Nhìn vào nhật ký cam kết, đó là cách này kể từ năm 2007
muffinista

4
IMO, referenceslà một lựa chọn mơ hồ cho một thuật ngữ. Họ đổi tên before_filterđể before_action, đó là một động thái tốt vì nó làm giảm sự mơ hồ. Một lợi thế của referencesnó là nó đơn giản khác với những gì bạn sử dụng trong mô hình, do đó bạn sẽ bớt bối rối hơn nếu bạn đang ở trong mô hình hoặc di chuyển. Nhưng bất kỳ thuật ngữ nào khác nhau sẽ đáp ứng tiêu chí này.
ahnbizcad

2
IMO referenceslà thuật ngữ tốt hơn ở cấp độ db.
vasilakisfil

1
Tôi thực sự không nghĩ rằng chúng thực sự có nghĩa tương tự trong tiếng Anh ... Vì vậy, nó hơi kỳ lạ.
xji
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.