【问题标题】:Rails won't let me change records during migrationRails 不允许我在迁移期间更改记录
【发布时间】:2010-11-01 15:14:34
【问题描述】:

这一定很简单,但它让我发疯了!
我有一个迁移,我想在之后更新记录

class SubjectsTextField < ActiveRecord::Migration
  def self.up
    add_column :users, :subjects, :text

    User.find(39).update_attribute :subjects, "hey there"
  end

  def self.down
    remove_column :users, :subjects
  end
end

该列已创建,但当我检查记录 39 时,它的主题字段为空,并且没有说“嘿,那里”。迁移过程中没有抛出任何错误,并且 update_attribute 行返回 true,就好像它已经工作了一样。

这行代码在控制台中完美运行,达到了预期的效果:

User.find(39).update_attribute :subjects, "hey there"

我尝试将 update_attribute 行放在第二次迁移中。如果我在一个“rake db:migrate”中将它们都吹到当前,它仍然不起作用。

但这是奇怪的部分。如果我运行两个单独的迁移,说“rake db:migrate VERSION=10”只创建列,然后第二个用“rake db:migrate”更新属性 IT WORKS!

到底发生了什么...如何在迁移期间修改记录?我似乎记得过去经常这样做。也许它与 Rails 2.3.2 有所不同?

谢谢! 布赖恩

【问题讨论】:

    标签: ruby-on-rails migration


    【解决方案1】:

    您需要在更改的模型上调用reset_column_information,然后才能使用新列。在add_column 之间添加这个并更新:

    User.reset_column_information
    

    请参阅ActiveRecord::Migration 页面上的“更改表格后使用模型”。

    【讨论】:

    • 就是这样,谢谢迈克尔!不敢相信我以前从未遇到过这种情况……谢谢一百万。
    • 我遇到了类似的问题。有人没有在创建模型的迁移中使用 t.timestamps,但他们使用了 t.datetime :updated_at。所以我想添加 :created_at 并将任何现有对象的 created_at 初始化为 updated_at 的当前值,但它总是为零。奇怪的是,当我尝试使用 Time.now 时它运行良好。无论如何,谢谢迈克尔。你的帖子帮助很大!这为我解决了问题。
    • 感谢 Michael 提供指向 api 页面的链接:它有助于保持更新,因为在其他页面上我发现 #reset_column_information 方法已被弃用..
    • 这对我也有帮助。谢谢。只是想知道为什么。当我第一次创建它们时,我的迁移实际上工作了,然后我决定擦除我的数据库,从备份中恢复并重新运行迁移,但它没有工作。仍然挠头,为什么它第一次有效,但现在不行。但无论如何,这让我继续前进。
    • 兄弟,你现在应该得到超过 +1 -> +100。这让我发疯了好几个小时。
    【解决方案2】:

    这个语法很清楚...试试 change_table

    class AddReceiveNewsletterToUsers < ActiveRecord::Migration 
       def self.up 
        change_table :users do |t| 
          add_column :users, :subjects, :text
        end
        User.find(39).update_attribute "subjects", "hey there"
      end  
    
      def self.down 
       remove_column :users, :receive_newsletter  
      end 
    end 
    

    【讨论】:

      【解决方案3】:

      如果您在初始迁移中像这样将两者结合起来,是否可行?

      class SubjectsTextField < ActiveRecord::Migration
        def self.up
          add_column :users, :subjects, :text
      
          User.find(39).update_attribute "subjects", "hey there"
        end
      
        def self.down
          remove_column :users, :subjects
        end
      end
      

      【讨论】:

      • 不,引号不能这样工作,感谢您的回复!
      猜你喜欢
      • 1970-01-01
      • 2018-12-27
      • 2013-12-26
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 2014-09-01
      • 2012-03-23
      相关资源
      最近更新 更多