【问题标题】:Can't update records in my Rails database migrations无法更新我的 Rails 数据库迁移中的记录
【发布时间】:2011-04-21 19:02:42
【问题描述】:

例如我有以下迁移

class AddStatusField < ActiveRecord::Migration
  def self.up
    add_column :tasks, :status, :string
    Task.update_all "status='complete'", "completed = 't'"
    remove_column :tasks, :completed
  end
end

当我运行它时(使用rake db:migrate),我收到以下消息

==  AddStatusField: migrating =================================================
-- add_column(:tasks, :status, :string)
   -> 0.0010s
-- update_all("status='complete'", "completed = 't'")
rake aborted!
An error has occurred, this and all later migrations canceled:

undefined method `update_all' for #<ActiveRecord::ConnectionAdapters::SQLite3Adapter:0xd3d34a8>

如果我立即再次运行迁移,update_all 调用似乎可以工作。

我正在使用 Rails 2.3.5 和 sqlite3。

什么给了?

【问题讨论】:

    标签: ruby-on-rails sqlite rails-migrations


    【解决方案1】:

    看起来可能是与Task 的命名冲突。它是否因您的应用程序中的任何其他类而失败,或者只是 Task?

    您可以使用::Task 调用它,以表明您希望在根命名空间中使用Task 类。例如,Rake 定义了自己的 Task 类,迁移过程中的某些东西可能也在做同样的事情。

    【讨论】:

    • 啊哈,我想你可能是对的 Shadwell。我尝试使用 :: 前缀,但这没有任何区别。我刚刚用不同的模型进行了测试,效果很好。那么...如何避免重命名我的 Task 模型?
    • 果然Task出现在wiki.rubyonrails.org/rails/pages/reservedwords中。该死!感谢您的帮助。
    【解决方案2】:

    尝试添加

    Task.reset_column_information
    

    就在您的 update_all 之前

    【讨论】:

    • 这给了我:undefined method 'reset_column_information' for #&lt;ActiveRecord::ConnectionAdapters::SQLite3Adapter:0 xd367598&gt;
    • Voldy,不,第二个参数"completed = 't'" 是我的条件(即 where-clause)。此外,我收到的错误消息是 update_all 不存在。
    • 本,我明白了。我的错。非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多