2015-04-29 130 views
0

我在遺留應用程序(過時的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_informationset_table_name,但我認爲這也不是很好的解決方案。

我的問題是你知道什麼可能會導致這個問題,以及如何解決它而無需重新加載類緩存?

+0

不可以,但我現在檢查它,結果並不令人滿意: irb(main):001:0> Great :: Item.table_name_prefix =>「great_」 irb(main):002:0> Great :: Item.table_name =>「items」' – SZMER

回答

1

假設表名不考慮模塊,正如你注意到的。

但你已經知道了,你可以自己設置它,使用:

self.table_name = 'great_items' 

this doc,因爲您使用3.0。X,你必須使用:

set_table_name "great_items" 

這必須在你的類定義的頂部放

+0

我寫了它didn沒有解決 - 與'set_table_name'&'reset_ta相同的結果ble_name'。表名稱設置正確,但查詢是用錯誤的表名建立的。 – SZMER

+0

你確定你添加了'self'? – apneadiving

+0

是的。我嘗試過和沒有「自我」。 – SZMER

1

試試這個

class RenameOldTableToNewTable< ActiveRecord::Migration 
    def self.up 
    rename_table :old_table_name, :new_table_name 
    end 
    def self.down 
    rename_table :new_table_name, :old_table_name 
    end 
end 
+0

不能更改表名稱,因爲它會打破與其他系統的向後兼容性。此外,在其他服務器上,此代碼僅適用於其中一個例外:) – SZMER

+0

然後,您應該使用@apneadiving建議的set_table_name – Xeeshan

相關問題