2013-05-09 62 views
0

我有一個關於將Rails遷移中的列的默認值設置爲非靜態值的快速問題。Rails遷移 - 非靜態默認值

我有一個「用戶」表,已經有列id,first_name和last_name,我想添加一個名爲「用戶名」,默認爲用戶的姓氏的新列。這是我目前有:

class AddLoginToUsers < ActiveRecord::Migration 
    def change 
    add_column :users, :username, :string, :default => :last_name 
    end 
end 

顯然,這不會產生預期的結果(它默認爲字符串「last_name」)。我將如何去設置默認的行的last_name值?

在此先感謝。

+0

記住遷移只是將SQL命令發送到數據庫平臺,所以首先您需要知道您甚至希望這些命令是什麼。你可以使用觸發器或SQL Server的計算列完成你想要做的事情,但是我強烈建議你完全放棄數據庫技巧,並在應用層處理這個問題,就像在@ mind.blank的答案中一樣。 – 2013-05-09 06:32:53

回答

2

不知道你能做到這一點,你可以代替你的User模型添加一個before_validationbefore_save回調:

class User < ActiveRecord::Base 
    before_validation :create_username_if_missing 

    private 

    def create_username_if_missing 
    self.username = last_name unless username 
    end 
end 

,加入該回調後更新所有exisiting用戶:

User.where("username is null").each do |user| 
    user.update_attributes(username: user.last_name) 
end