【问题标题】:How can I store the object `id` in a migration file?如何将对象“id”存储在迁移文件中?
【发布时间】:2011-06-30 07:31:11
【问题描述】:

我正在使用 Ruby on Rails 3.0.7 和 MySQL 5.1。我想强制将对象id 存储在迁移文件中。例如我有这个:

User.create!(
  :name => 'Test name'
)

但我想做这样的事情:

User.create!(
  :id   => '12345', # Force to store the object data with id '12345'
  :name => 'Test name'
)

注意:以上代码不会强制数据库中的id值。

有可能吗?如果有,怎么做?

【问题讨论】:

  • 我不知道这样的事情是否可行,但我认为强制对象 ID 不是一个好主意。根据您应用程序的设置,这可能会导致 ID 冲突,从而可能会中断迁移。
  • @Koraktor - 我用它在应用程序启动时设置一些默认数据。这只是初始化数据库并确保事情按预期进行。
  • 使用 rake 任务或 db:seed 获取默认数据?
  • @Mikhail Nikalyukin - 你为什么这么问?

标签: ruby-on-rails database ruby-on-rails-3 migration


【解决方案1】:

您不能批量分配 id 等受限字段。但您可以单独设置它们:

user = User.new(:name => 'Test name')
user.id = 12345
user.save!

User.create!(:name => 'Test name') do |user|
  user.id = 12345
end

【讨论】:

    【解决方案2】:

    您确实可以批量分配受保护的字段。这是如何做到的。在您的模型中定义以下内容:

    def attributes_protected_by_default
      default = [ self.class.inheritance_column ]
    end
    

    您在这里所做的是覆盖基本方法:

    # The primary key and inheritance column can never be set by mass-assignment for security reasons.
    def self.attributes_protected_by_default
      default = [ primary_key, inheritance_column ]
      default << 'id' unless primary_key.eql? 'id'
      default
    end
    

    ...仅包括 inheritance_column 不包括 idprimary_key 列。此时,您现在可以为该模型批量分配 ID。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 2020-11-09
      • 1970-01-01
      • 2019-09-11
      • 2013-09-13
      • 2016-10-16
      • 1970-01-01
      相关资源
      最近更新 更多