2010-12-16 176 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