免责声明:我不知道红宝石。
我一直在尝试设置这个ruby应用程序。我正在尝试调试为什么我得到一个未初始化的常量错误:
rake aborted!
StandardError: An error has occurred, all later migrations canceled:
uninitialized constant CreateSyncsTable::Syncs/var/rails/cycs/cycs/db/migrate/20100818122117_create_syncs_table.rb:8:in `up'
以下是20100818122117_create_syncs_table.rb的文件内容。
class CreateSyncsTable < ActiveRecord::Migration
def self.up
create_table :syncs do |t|
t.timestamps
t.integer :remedy_query_low
t.integer :remedy_query_high
end
Sync.create :remedy_query_low => 0, :remedy_query_high => 0
end
def self.down
drop_table :syncs
end
end
据我了解,第8行正在尝试在同步表中创建一个新条目。我不知道为什么这样做的语法如下:
Sync.create :remedy_query_low => 0, :remedy_query_high => 0
我也不明白为什么或“Sync”的来源。而且,我不知道什么是未经初始化的。
任何有关调试此操作的帮助表示赞赏。为了记录,我使用的是centOS 7,Maria DB和ActiveRecord版本3.2.18。
答案 0 :(得分:0)
尝试添加对ActiveRecord::ModelSchema.reset_column_information
的调用,因为它“重置有关列的所有缓存信息,这将导致它们在下一个请求时重新加载”,允许您在之后立即创建Sync
个条目在迁移中创建表:
class CreateSyncsTable < ActiveRecord::Migration
def self.up
create_table :syncs do |t|
t.timestamps
t.integer :remedy_query_low
t.integer :remedy_query_high
end
Sync.reset_column_information
Sync.create :remedy_query_low => 0, :remedy_query_high => 0
end
def self.down
drop_table :syncs
end
end
就我个人而言,我建议完全删除Sync.create :remedy_query_low => 0, :remedy_query_high => 0
声明,因为我认为Rails迁移最适合仅用于架构迁移,而数据迁移最好放在rake
任务中(一个很好的理由可以找到here)。
答案 1 :(得分:0)
在这种情况下,Sync指的是模型。 应该在app/models/
中有一个名为sync.rb
的文件,这是Sync类的模型定义。这是用于定义模型的Rails约定。
您可以在迁移中使用模型(您一直在查看迁移)。但是,通常不建议您在迁移中使用应用的模型,因为最终可能会发生冲突。
建议您在迁移中定义代理模型,该代理模型取代了应用模型以进行迁移。您在迁移文件的顶部声明代理模型,以便它在迁移时是本地的。
试试这段代码:
class Sync < ActiveRecord::Base
end
class CreateSyncsTable < ActiveRecord::Migration
def self.up
create_table :syncs do |t|
t.timestamps
t.integer :remedy_query_low
t.integer :remedy_query_high
end
# Reset ActiveRecord cache of Sync details
Sync.reset_column_information
Sync.create :remedy_query_low => 0, :remedy_query_high => 0
end
def self.down
drop_table :syncs
end
end
对Sync.reset_column_information
的附加调用告诉Rails重置有关模型的信息缓存,因为表结构已更改。这样可以防止出现问题,例如尝试访问迁移中添加的新列。