我们应该使用抽象的rails多态迁移语法吗?

时间:2012-03-30 17:46:58

标签: ruby-on-rails polymorphism standards

在Rails中编写多态迁移有两种方法。一般来说,我已经这样做了:

class CreateFeatures < ActiveRecord::Migration
  def change
    create_table :features do |t|
      t.integer  :featureable_id
      t.string   :featurable_type

      t.timestamps
    end
  end
end

但是,我们也可以这样做:

class CreateFeatures < ActiveRecord::Migration
  def change
    create_table :features do |t|
      t.references  :featureable, :polymorphic => true

      t.timestamps
    end
  end
end

出于所有实际目的,这两者是相同的。我的问题:一个比另一个好吗?是否有更好的未来可维护性?

只有当两件事中的一件发生变化时,这可能是一个问题:

  1. 多态抽象版本(版本#2)消失或语法改变
  2. 处理多态关系的方法(使用id和type)改变 - 不太可能
  3. 只是想知道是否存在偏好,或者它是否真的无关紧要&#34;

1 个答案:

答案 0 :(得分:0)

对于通过迁移生成所有表的所有rails应用程序,功能上没有区别。

以下是参考代码:

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

这一切都很好但是如果引用表上的外键不是_id,则方法一是唯一的选择。

引用只会为您节省一行代码......