【问题标题】:What is the difference between t.belongs_to and t.references in rails?rails 中的 t.belongs_to 和 t.references 有什么区别?
【发布时间】:2011-10-16 23:56:23
【问题描述】:

t.referencest.belongs_to 有什么区别? 为什么我们有这两个不同的词?在我看来,他们做同样的事情? 尝试了一些谷歌搜索,但没有找到任何解释。

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

【问题讨论】:

  • 它们的工作原理是一样的——这是一件坏事吗?引用为您插入一个外键列。您可以改用belongs_to 来使您的迁移更具可读性。有关详细信息,请参阅guides.rubyonrails.org/migrations.html
  • 并不是说这是一件坏事。只是对它们是否以相同或不同的方式工作感到困惑,因为我找不到具体说明它们工作相同的文档。 http://guides.rubyonrails.org/migrations.html 对此也不清楚。
  • 这可能只是为了向后兼容,references 将在以后的 Rails 版本中被弃用和删除。不要相信我的话,这只是一个有根据的猜测。
  • “另一个助手被称为引用(也可以作为belongs_to使用)。它最简单的形式只是增加了一些可读性”——来自指南
  • 这里也是源代码——belongs_to 是引用github.com/rails/rails/blob/…的直接别名

标签: ruby-on-rails rails-migrations


【解决方案1】:

看看the source code,他们做同样的事情——belongs_toreference的别名:

  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 进行其他类型的关联,这很好。

【讨论】:

  • 我想知道他们将来是否会保持这样的状态,或者他们会删除其中一个!?我喜欢这种方式,能够选择任何让我的代码看起来更像真正的英语。
  • 我猜两者都会留下来。查看提交日志,自 2007 年以来一直如此。
  • IMO,references 是一个不明确的术语选择。他们将before_filter 重命名为before_action,这是一个很好的举措,因为它减少了歧义。 references 的一个优点是它与您在模型中使用的完全不同,因此如果您在模型中或迁移中,您就不会感到困惑。但是任何不同的术语都可以满足这个标准。
  • IMO references 在数据库级别是更好的术语。
  • 我真的不认为它们在英语中的意思实际上是一样的......所以这有点奇怪。
猜你喜欢
  • 2021-08-16
  • 2012-06-15
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
相关资源
最近更新 更多