如何将此迁移转换为原始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
答案 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任务实现这一目标。