1

我在迁移期间遇到了基本的 Rails 问题。这是两个脚本

class CreateGoogleMaps < ActiveRecord::Migration
  def self.up
    create_table :google_maps do |t|
      t.string :name, :null => false
      t.string :description
      t.column "center", :point, :null => false, :srid => 4326, :with_z => false # 4326: WSG84
      t.integer :zoom
      t.datetime :created_at
      t.datetime :updated_at
      t.integer :created_by_id
      t.integer :updated_by_id
    end
  end

  def self.down
    drop_table :google_maps
  end
end

文件 #2 +++ 003_add_map_style.rb ++++++

class AddMapStyle < ActiveRecord::Migration
  def self.up
      add_column :google_maps, :style, :integer
      GoogleMaps.update_all( "style = 1")
  end

  def self.down
      remove_column :google_maps, :style
  end
end
***********************************************

这是我在迁移期间看到的内容 == CreateGoogleMaps:迁移 ====================================== ========== -- create_table(:google_maps) -> 0.0638s == CreateGoogleMaps: 已迁移 (0.0640s) ==================== ===================

== CreateMarkers:迁移 ============================================= ===== -- create_table(:markers) -> 0.0537s == CreateMarkers: 迁移 (0.0539s) ======================== =================

== AddMapStyle:迁移 ============================================== ======= -- add_column(:google_maps, :style, :integer) -> 0.0406s rake 中止!发生错误,所有后续迁移均已取消:

未初始化的常量 AddMapStyle::GoogleMaps

我正在使用 Rails 2.3.11。非常感谢任何调试提示!

4

2 回答 2

1

您不应该在迁移中使用模型,因为它很危险 - 模型可能会更改,您正在尝试加载 ActiveRecord 对象,同时从它们下面更改模式。

如果可以,您应该使用 SQL,例如运行原始更新命令的以下示例。

class AddMapStyle < ActiveRecord::Migration
  def self.up
      add_column :google_maps, :style, :integer
      execute("UPDATE google_maps SET style=1")
  end

  def self.down
      remove_column :google_maps, :style
  end
end
于 2013-02-07T16:12:15.503 回答
1

您可以像这样在迁移中安全地使用模型:

class AddMapStyle < ActiveRecord::Migration
  class GoogleMaps < ActiveRecord::Base; end

  def self.up
      add_column :google_maps, :style, :integer
      GoogleMaps.update_all( "style = 1")
  end

  def self.down
      remove_column :google_maps, :style
  end
end

由于该类是在迁移类内部定义的,因此它位于单独的命名空间中。

于 2013-02-07T16:18:06.650 回答