将Rails迁移转换为原始SQL

时间:2013-02-16 20:41:51

标签: sql ruby-on-rails

如何将此迁移转换为原始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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我偶然发现了一个very nice article,描述了如何通过自定义rake任务实现这一目标。