5

如何将此迁移转换为原始 sql?或者我可以转换吗?

class AddUnsubscribeTokenToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :unsubscribe_token, :string, :unique => true
    User.all.each do |user|
        user.unsubscribe_token = ActiveSupport::SecureRandom.hex(18)
    end
  end
  def self.down
    remove_column :users, :unsubscribe_token
  end
end
4

2 回答 2

3

AFAIK 您无法将单个迁移转换为 SQL,但您可以让 ActiveRecord 在 SQL 中而不是 Ruby 中输出您的模式。

# in config/application.rb

config.active_record.schema_format = :sql

这将在您的 db/schema 而不是 Ruby DSL 中为您提供 SQL 输出。但是这两种格式都不会包含设置用户令牌的代码片段。

此外,在迁移中包含类似的数据库修改代码被认为是一个坏主意。例如,如果您删除或重命名模型会发生什么,当迁移运行时它将失败。至少将其包装在模型检查中。或开始/救援/结束

if defined? User
  User.all.each do |user|
    user.unsubscribe_token = ActiveSupport::SecureRandom.hex(18)
  end
end

或者

begin
  User.all.each do |user|
    user.unsubscribe_token = ActiveSupport::SecureRandom.hex(18)
  end
rescue
end

最后,该片段不会按照您的意图执行,因为您在设置令牌后没有保存模型,无论是使用update_attributes还是调用user.save

于 2013-02-16T22:16:41.227 回答
2

我偶然发现了一篇非常好的文章,描述了如何通过自定义 rake 任务来实现这一点。

于 2015-02-06T13:48:06.550 回答