2010-12-16 174 views
0

所以我試圖遷移遷移腳本中的一些數據,但數據似乎並沒有保存。但是,如果我複製代碼並直接在控制檯中運行它,它會保存。誰能幫我弄清楚爲什麼?導軌遷移腳本VS控制檯

這是我的遷移腳本中的代碼。我將我自己表中的頭像數據移動到我的個人資料表中。

def self.up 
    add_column :users, :featured,   :boolean, :default => false 
    add_column :profiles, :avatar_file_name, :string 
    add_column :profiles, :avatar_content_type, :string 
    add_column :profiles, :avatar_file_size, :integer 
    add_column :profiles, :avatar_updated_at, :datetime 

    Avatar.all.each do |a| 
     user = User.find(a.user_id) 
     user.profile.avatar_file_name = a.avatar_file_name 
     user.profile.avatar_content_type = a.avatar_content_type 
     user.profile.avatar_file_size = a.avatar_file_size 
     user.profile.avatar_updated_at = a.updated_at 
     if a.featured == true 
     user.featured = true 
     end 
     user.save 
    end 

    # drop_table :avatars 
    end 
+0

而不是'如果a.feature ==真',你可以,如果使用'。功能?'。 Rails自動添加?到布爾屬性的末尾。 – 2010-12-16 03:08:05

回答

5

我認爲這是因爲您正在更改列並嘗試在相同的遷移中使用它們,但模型並不知道這些字段。

嘗試增加上述Avatar.all.each這些行...

User.reset_column_information 
Profile.reset_column_information 

更多關於這http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-reset_column_information

+0

這就是它!謝謝!現在唯一的問題是那個討厭的特色欄目。 sqlite將它存儲爲't'&'f',我似乎無法弄清楚如何實現這個價值。我嘗試了各種各樣的'== true','=='t'',檢查'if featured?'的組合。即時通訊不知道發生了什麼,但只是在我的例子中設置它不起作用。他們總是回報錯誤。 – brewster 2010-12-16 06:15:13

+0

@brewster:如果您遺漏了一個異常,請嘗試'user.save!'。在遷移中引發異常通常是件好事。您也可以在'log/development.log'中查看執行的SQL。 – zetetic 2010-12-16 06:39:58

+0

@brewster - 正如zetetic所述,嘗試使用'save!'。用戶可能無效,這會告訴你爲什麼在遷移期間。 – 2010-12-16 13:05:38