2016-05-12 38 views
0

免責聲明:我不知道紅寶石。ActiveRecord ::遷移單元化常量錯誤。

我一直在試圖設置這個紅寶石應用程序。我試圖調試爲什麼我得到一個未初始化的常數錯誤:

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行正試圖創建一個新的條目到syncs表中。我不知道爲什麼這樣做的語法如下:

Sync.create :remedy_query_low => 0, :remedy_query_high => 0 

我也不明白「同步」來自何處或何處。而且,我不知道什麼常數是未初始化的。

任何幫助調試此讚賞。爲了記錄,我使用了centOS 7,Maria DB和ActiveRecord版本3.2.18。

  1. 我回顧了API看看是否有幫助。因爲我不知道紅寶石,所以我覺得沒有太大的幫助。
+0

'Sync'是一個模型,它應該在'app/models/sync.rb'文件中聲明。 – igwan

+0

@torrho你解決了你的問題嗎? –

回答

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)。

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,因爲表的結構發生了變化重置的關於模型的信息緩存。這樣可以防止出現問題,例如嘗試訪問遷移中添加的新列。

+0

@torrho這是否回答您的問題?如果是這樣,請點擊答案旁邊的複選標記以接受它。複選標記將變綠。 Upvotes也是受歡迎的! –