2015-01-13 44 views
2

我一直在研究最近幾個月的項目,最初幾個月是在4.1.6中開發的,我是現在試圖將其更新到4.2.0(我已經逐步測試了4.1.6和4.2.0之間的所有版本,並且所有的4.1.x版本都沒有錯誤地工作,並且只有當我轉到4.2.0時,我纔會看到我在這裏描述的問題)。Ruby on Rails在將rails項目從4.1.9更新到4.2.0之後引發「錯誤的表名」錯誤

在這個應用程序中,所有模型都有很多共享的功能,所以我創建了一個抽象類,並且我所有的模型都從這個類繼承而來。

class TrackableModel < ActiveRecord::Base 
    self.abstract_class = true 
    ... 
end 

class User < TrackableModel 
    ... 
end 

在Gemfile中唯一的變化是改變gem 'rails', '4.1.6'gem 'rails', '4.2.0'

更新過程使用rake rails:update按照指示HERE,隨後它與在同一文檔的第2節中的升級步驟。

我用這個rake任務的默認值覆蓋了所有衝突的文件,但是之後每次都檢查並在我的修改中工作。

更新前,通過了所有測試,但在更新

130 runs, 0 assertions, 0 failures, 130 errors, 0 skips 

與錯誤

ActiveRecord::StatementInvalid: Mysql2::Error: Incorrect table name '': SHOW FULL FIELDS FROM `` 

Error: 
xxxTest#test_yyy: 
NoMethodError: undefined method `each' for nil:NilClass 

的應用似乎沒有任何改變用戶體驗的工作後。除非我嘗試執行測試,否則一切看起來都不錯。

我只是不能讓我的測試運行。

更新:

我忘了提,我運行

ruby 2.1.5p273 (2014-11-13 revision 48405) [i386-mingw32]. 

此外,我一直在努力遵循的執行路徑。它試圖設置燈具時似乎失敗了。它正在經歷一個建立表的schema_cache的循環。它查詢schema_migrations和我的第一個自定義表「customers」(在這個調用過程中,它遍歷這個表上的每一個看起來成功的列)。

在下次調用

ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.columns(table_name#String) 

table_name的價值爲零

不幸的是,我仍然足夠新的紅寶石,我有發現其中TABLE_NAME值(schema_migrations,客戶的困難/導軌,零,...)實際上正在設置。

有人可以幫助指出表的列表來自那是建立schema_cache的方向?

回答

5

我遇到了同樣的問題,並能夠解決它。在我的情況下,從ActiveRecord繼承的基類包含belongs_to:foo語句。我把它移到了基類的子類和加載的裝置上。

所以,這裏有一個例子:

class BaseAwesomeModel < ActiveRecord::Base 
    self.abstract_class = true 

    # This is what was causing the issue, moved to subclasses 
    # belongs_to :something 
end 

class AnotherModel < BaseAwesomeModel 
    belongs_to :something 
end 

class YetAnotherModel < BaseAwesomeModel 
    belongs_to :something 
end 

我不知道這是什麼原因造成您的燈具加載失敗,但它是我的問題的根源。

祝你好運!

+0

謝謝那麼多!當我做出這個改變時,我的測試班又回到了一切。在一個相關的問題上,我試着將我的abstract_class中的belongs_to語句留在未評論的地方,只將它添加到需要它的模型中。在繼承這個的12個模型中,只有4個需要這個改變。其他8個似乎工作。但是如果我把它從這4箇中的任何一箇中排除出去,100%的測試都會失敗。離奇! – Tezyn

+0

這很奇怪。我不確定它是一個錯誤還是什麼。 – curtp

+0

我有一個類似的問題,並通過保持關聯聲明在抽象類中解決它,而不是在fixture文件中執行'something::fixture_name'我用'something_id替換它:<%= ActiveRecord :: FixtureSet.identify(: fixture_name)%>' – Shadwell

0

只是爲別人記誰遇到這個問題,並沒有在基礎定義的關係(抽象)類:

作用域也引起抽象類這個問題(在相同的方式, belongs_to的做了以前的回答者),但顯然,如果將其移動到一個類的方法它的工作原理:

變化:

scope :scope_name, -> { #code } 

要:

def self.scope_name 
    #code 
end 

我的問題實際上是由完全不同的東西造成的。我以前使用foreigner寶石,它有定義,可以是這樣的遷移:如果你將這些爲外鍵的新的內在軌道語法,它的工作原理

change_table :table_name do |t| 
    t.remove_foreign_key :column_name 
end 

remove_foreign_key :table_name, :column_name