我在遺留應用程序(過時的rails-3.0.20)中發現了一個問題。 該應用程序有很多組件和嵌套模型。問題僅存在於生產服務器之一(與其他生產和礦山開發相同的環境)。帶名稱空間的模型 - 錯誤的表名(沒有命名空間)
有與名稱空間模型,它看起來像
module Great
class Item
end
end
表名稱被命名爲great_items
。
當我調試/打開它在服務器上的故障,我發現計算表名是items
is great_items
。
$ Great::Item.all
#=> ActiveRecord::StatementInvalid: No attribute named `name` exists for table `items`
所以我認爲mby是simmilar類具有相同的命名空間,我已經檢查過,它不是。我的第二個想法是設置表名明確我試圖
self.table_name = 'great_items'
# &
set_table_name 'great_items'
後,這改變了我運行rails c
和表名是設置好的細:
$ Great::Item.table_name
#=> 'great_items'
但是當我試圖獲得一些項目出現了怪胎錯誤,直到現在我還不明白!
$ Great::Item.all
#=> ActiveRecord::StatementInvalid: Mysql2::Error: Table 'db.items' doesn't exist: SELECT `great_items`.* FROM `items` WHERE `great_items`.`some_default_scope` = 0
正如你可以看到示例表上面有正確的名稱爲select
值和where
聲明,但在from
值不正確。
我很好奇,所以我檢查了ActiveRecord::Base
mysql適配器,並且有某種捕捉表名,所以我試圖去reset_table_name
。重置幫助建立預期的名稱('great_items'),但以上錯誤沒有錯過。
當我在生產環境中開始捕捉問題時,問題消失 - 但這不是解決方案。
最後我有點'解決'這個使用reset_column_information
後set_table_name
,但我認爲這也不是很好的解決方案。
我的問題是你知道什麼可能會導致這個問題,以及如何解決它而無需重新加載類緩存?
不可以,但我現在檢查它,結果並不令人滿意: irb(main):001:0> Great :: Item.table_name_prefix =>「great_」 irb(main):002:0> Great :: Item.table_name =>「items」' – SZMER