2012-05-23 77 views
5

我遇到一個問題,在一個新的Rails應用程序(3.2.3)上運行我的遷移。我們使用postrgres 9.1.3和 - 皮克(0.13.2) -型號範圍正在打破耙分貝:遷移 - 軌道3.2.3的Postgres 9.1.3

當我運行耙分貝:創建,然後耙分貝:遷移,我得到 - >

1.9.3-p194 (master) rake db:migrate --trace 
** Invoke db:migrate (first_time) 
** Invoke environment (first_time) 
** Execute environment 
rake aborted! 
PG::Error: ERROR: relation "roles" does not exist 
LINE 4:    WHERE a.attrelid = '"roles"'::regclass 
            ^
:    SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull 
      FROM pg_attribute a LEFT JOIN pg_attrdef d 
      ON a.attrelid = d.adrelid AND a.attnum = d.adnum 
     WHERE a.attrelid = '"roles"'::regclass 
      AND a.attnum > 0 AND NOT a.attisdropped 
     ORDER BY a.attnum 

我得到這個連沒有定義任何遷移,所以我不認爲這是遷移本身的問題。當我查看堆棧跟蹤時,我發現我的用戶模型中定義的作用域正在運行 - 當我將它們註釋掉時,遷移運行沒有問題。

scope :team_leaders, where(role_id: Role.where(name: 'Team Leader').first.try(:id)) 
scope :area_leaders, where(role_id: Role.where(name: 'Area Leader').first.try(:id)) 
scope :nation_leaders, where(role_id: Role.where(name: 'Nation Leader').first.try(:id)) 
scope :employees, where(role_id: Role.where(name: 'Employee').first.try(:id)) 

這是一個軌道錯誤,或者我做錯了什麼?我非常感謝一些幫助 - 我們可以在應用程序中刪除這些範圍的使用,但這是我們想要避免的。

我應該把這些示波器某種條件時,導軌在控制檯或服務器而不是遷移期間加載哪個叫裏面?

非常感謝,

丹Sowter說

+0

貌似表不是在數據庫創建的角色:創建。是否有角色遷移?你正在使用像acl9或role_requirement這樣的角色插件嗎?如果是這樣,請確保您沒有錯過需要運行的發電機。 –

+4

您可能還想嘗試在lamda中包裝引起問題的範圍,以便在實際使用之前不對其進行評估。 –

回答

16

我有完全相同的問題。 2小時調試和拉我的頭髮掉後,這個得天獨厚的人被稱爲卡爾Zulauf張貼在評論的答案。

的問題是,當我們運行遷移的範圍正在評估,因此與尚未遷移將導致錯誤的另一個表中的任何依賴性。

只是包裝所有的範圍與拉姆達。例如:

scope :team_leaders, lambda { where(role_id: Role.where(name: 'Team Leader').first.try(:id)) } 

對所有示波器都這樣做。

這應該做的伎倆。他們需要懶惰評估(只是當被調用),並沒有lambda他們正在評估馬上。

+2

非常感謝尼古拉斯。對不起,我沒有早點回復 - lambda解決方案正是我所做的,而且它工作。我試圖用某種方式來包裝範圍,除非Rails.env =='遷移'的概念,但lambda是勝利者。 –

+0

非常感謝你! :) –

+0

你應該在遷移中使用範圍?我認爲這是不好的做法,因爲如果你突然想要添加對該範圍的更改,那麼可能不一定與之前的遷移一致,如果你回滾了。(fyi,即使有關於如何解釋處理這個) – dtc

3

如果您的示波器以find_開頭,如find_by_foo那麼它們將打破rake db:migrate。 這是我的情況中的錯誤。

+1

我遇到了同樣的問題,我將範圍名稱從'find_by_foo'改爲'search_by_foo'。 – shweta

0

其實我有同樣的問題與引起默認範圍,這樣的遷移:

ModelName.all.each_with_index do |m, i| 
... 
end 

這個問題通過unscoping解決:

default_scope where(deleted: false) 

錯誤在代碼這樣的塊造成

ModelName.unscoped.each_with_index do |m, i| 
... 
end