如何将此迁移转换为原始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发布于 2013-02-17 06:16:41
你不能把单一的迁移转换成SQL,但是你可以让ActiveRecord用SQL而不是Ruby来输出你的模式。
# in config/application.rb
config.active_record.schema_format = :sql这将在您的db/schema中提供SQL输出,而不是Ruby DSL。但是这两种格式都不会包含设置用户令牌的代码片段。
此外,在您的迁移中包含这样的DB修改代码也被认为是一个坏主意。例如,如果您删除或重命名模型会发生什么情况,当迁移运行时会失败。至少把它包装在模型的检查中。或者是begin/rescue/end
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
发布于 2015-02-06 21:48:07
我偶然发现了一个very nice article,描述了如何通过自定义的rake任务来实现这一点。
https://stackoverflow.com/questions/14914892
复制相似问题