将 Rails 迁移转换为原始 SQL

Joh*_*ash 5 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
Run Code Online (Sandbox Code Playgroud)

Clu*_*ter 3

据我所知,您无法将单个迁移转换为 SQL,但您可以让 ActiveRecord 以 SQL 而不是 Ruby 输出您的架构。

# in config/application.rb

config.active_record.schema_format = :sql
Run Code Online (Sandbox Code Playgroud)

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

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

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

或者

begin
  User.all.each do |user|
    user.unsubscribe_token = ActiveSupport::SecureRandom.hex(18)
  end
rescue
end
Run Code Online (Sandbox Code Playgroud)

最后,该代码片段不会执行您的预期,因为您在设置令牌后没有保存模型,使用update_attributes或调用user.save