2013-02-16 93 views
2

如何將此遷移轉換爲原始sql?或者我可以轉換嗎?將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

AFAIK你不能將一個單一的遷移到SQL,但你可以在SQL,而不是紅寶石ActiveRecord的輸出架構。

# 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

0

我偶然發現一個very nice article,描述瞭如何通過自定義rake任務來實現。