4

Rails 迁移指南建议您在迁移中创建一个人造模型,如果您需要对数据库中的数据进行操作,例如:

class AddFuzzToProduct < ActiveRecord::Migration
  class Product < ActiveRecord::Base
  end

  def change
    add_column :products, :fuzz, :string
    Product.reset_column_information
    Product.all.each do |product|
      product.update_attributes!(:fuzz => 'fuzzy')
    end
  end
end

问题是,在AddFuzzToProduct类中,产品模型的名称将是AddFuzzToProduct::Product. 我有以下情况:

class RemoveFirstNameFromStudentProfile < ActiveRecord::Migration

  class StudentProfile < ActiveRecord::Base
    has_one :user,:as => :profile
  end

  class User < ActiveRecord::Base
    belongs_to :profile,:polymorphic => true,:dependent => :destroy
  end

  def up
    StudentProfile.all.each do |student|
       # I need to do some work on the user object as well as on the student object
       user = student.user
       ... # do some stuff on the user object
    end
  end

end

问题是,在each学生资料的块内,用户是零。激活记录器后,我可以看到 Rails 正在尝试执行以下查询:

 RemoveFirstNameFromStudentProfile::User Load (0.8ms)  SELECT "users".* FROM "users" WHERE "users"."profile_id" = 30 AND "users"."profile_type" = 'RemoveFirstNameFromStudentProfile::StudentProfile' LIMIT 1

当然,这可以通过将UserandStudentProfile向上移动一级来解决,例如:

  class StudentProfile < ActiveRecord::Base
    has_one :user,:as => :profile
  end

  class User < ActiveRecord::Base
    belongs_to :profile,:polymorphic => true,:dependent => :destroy
  end

  class RemoveFirstNameFromStudentProfile < ActiveRecord::Migration
    def up
      StudentProfile.all.each do |student|
        ...
      end
    end
  end

我的问题是:将人造模型的定义移到迁移声明之外会对我造成任何问题吗?我在这里缺少什么吗?为什么 Rails 团队的人在迁移类中声明它们?

4

2 回答 2

2

使用 Ruby,您始终可以通过在类或模块前面加上::.

您的示例迁移如下所示:

class AddFuzzToProduct < ActiveRecord::Migration
  class ::Product < ActiveRecord::Base
  end

  ...
end
于 2012-10-01T04:03:19.883 回答
1

不,它不会对您造成任何问题,因为您没有添加任何新列并对其进行更新。

Rails 团队已在迁移中声明它,因为他们正在添加一个新列然后对其进行更新,但如果 Model 在外部并且它将尝试验证该列是不可能的,因为它不存在,它只是在迁移中添加的。由于这个原因,他们在迁移中创建了本地模型,只是为了更多阅读在迁移中使用模型

于 2012-09-27T12:26:17.723 回答