rails中的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
它们的工作原理相同-是一件坏事吗?引用会为您插入一个外键列。您可以改用belongs_to使您的迁移更具可读性。有关某些详细信息,请参见guides.rubyonrails.org/migrations.html
muffinista 2011年

1
不说这是一件坏事。只是因为它们的工作原理相同或不同而感到困惑,因为我找不到专门说明它们工作原理相同的文档。http://guides.rubyonrails.org/migrations.html对此也不清楚。
Tornskaden

3
这可能只是为了向后兼容,references在以后的rails版本中将不建议使用并删除它。不要相信我,这只是有根据的猜测。
砖匠2011年

“另一个帮助程序称为引用(也可以作为belongs_to提供。以最简单的形式,它只是增加了一些可读性”)-来自指南
muffinista 2011年

5
也是这里的源代码——belongs_to
muffinista 2011年

Answers:


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

我想两者都将留在这里。查看提交日志,自2007
。– muffinista 2011年

4
IMO,references是一个术语的模棱两可的选择。他们改名before_filterbefore_action,这是一个好举动,因为它减少了歧义。优点之一references是,它与您在模型中使用的完全不同,因此,如果您在模型或迁移中,就不会感到困惑。但是任何不同的术语都可以满足该条件。
ahnbizcad 2014年

2
IMO references在数据库级别上是更好的术语。
vasilakisfil 2014年

1
我真的不认为它们在英语中实际上是同一意思……所以有点奇怪。
xji 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.