レールのt.belongs_toとt.referencesの違いは何ですか?


123

違いは何であるt.referencesとはt.belongs_to?なぜこれら2つの異なる単語があるのですか?彼らは同じことをしているように思えますか?いくつかの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
彼らは同じように機能します-それはそんなに悪いことですか?リファレンスは外部キー列を挿入します。代わりにbelongs_toを使用して、移行を読みやすくすることができます。詳細については、guides.rubyonrails.org / migrations.htmlを参照してください。
muffinista

1
それは悪いことではありません。それらが同じように機能するのか、別の方法で機能するのかについて混乱しました。特に、それらが同じように機能することを示すドキュメントが見つからないためです。http://guides.rubyonrails.org/migrations.htmlもその点については明確ではありません。
Tornskaden、2011年

3
これはおそらく下位互換性のためreferencesであり、レールの将来のリリースでは非推奨になり削除される予定です。これについて私の言葉を言わないでください。それは単なる知識に基づく推測です。
煉瓦工

「他のヘルパーは(belongs_toのようにも利用可能)の参照と呼ばれている最も単純な形式ではそれだけでいくつかの読みやすさを追加します。」 -ガイドから
muffinista

5
また、ここではソースコードはだ- belongs_toのは、参照用のストレート別名であるgithub.com/rails/rails/blob/...
muffinista

回答:


161

ソースコードを見ると、彼らはまったく同じことをします- 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、2011年

どちらもここに留まると思います。コミットログを見ると、2007
。– muffinista '17年

4
IMO referencesは、用語のあいまいな選択です。彼らはに名前before_filterを変更しましたbefore_action。あいまいさを減らしたので、これは良い動きでした。利点の1つreferencesは、モデルで使用するものとは単純に異なるため、モデルや移行の際に混乱することが少ないことです。ただし、異なる用語はこの基準を満たします。
ahnbizcad 2014

2
IMO referencesはdbレベルでより良い用語です。
vasilakisfil 14

1
英語で同じ意味だとは思いませんが…ちょっと変です。
xji
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.