4

我有一個新的Rails 4應用程序,我在STI配置中創建了幾個模型。單表繼承無法在Rails 4應用程序工作 - ActiveRecord :: SubclassNotFound:單表繼承機制失敗

主要模型被稱爲Order,它繼承自ActiveRecord::Base。這是它的樣子:

class Order < ActiveRecord::Base 
    TYPES = %w(remote local) 

    scope :remotes, -> { where(type: 'remote') } 
    scope :locals, -> { where(type: 'local') } 
end 

其他兩種模式都在models/orders一個文件夾中,它們被稱爲RemoteLocal,他們都繼承Order

的命令遷移文件看起來是這樣的:

def change 
    create_table :orders do |t| 
    t.string :source_url, null: false 
    t.string :final_url, null: false 

    t.string :type 

    t.string :category 

    t.timestamps 
    end 
end 

我還相信我,包括models/orders目錄到Rails,這樣做:

config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')] 

現在,當我用空數據庫登錄控制檯並運行Order.all時,一切都很好,我得到一個空的關係對象。但我創建第一個Remote對象,並嘗試運行Order.all我再次碰到下面的錯誤後:

>> Order.all 
Order Load (1.0ms) SELECT "orders".* FROM "orders" 
ActiveRecord::SubclassNotFound: The single-table inheritance mechanism failed to locate 
the subclass: 'Remote'. This error is raised because the column 'type' is reserved 
for storing the class in case of inheritance. Please rename this column if you didn't 
intend it to be used for storing the inheritance class or overwrite 
Order.inheritance_column to use another column for that information. 

這到底是怎麼回事?我做錯了什麼?

在此先感謝。

+0

您是如何看待「遠程」類的? – spickermann

+0

類遠程<訂單 before_save:set_type 私人 高清set_type self.type =「遠程」 結束 結束 – rodrigoalves

+1

你爲什麼花這麼大的力氣來操縱自己的類型列? Rails將完全爲你處理... –

回答

3

爲了調試這一點,我想簡單,看看我從兩個實驗的一個學習...

首先,哪怕只是暫時,將子出訂單的文件夾。這可能是因爲你將它們嵌套在Module中,或者Rails期望它們基於名稱,所以'type'列與你認爲它不符合。

第二,我會嘗試從命令行創建一個子類,堅持它,並查看ActiveRecord在該類型列中放入的內容並查看它是否與您期望的內容匹配。

我懷疑這與模型下的子文件夾有關,而Rails無法根據類型指定它來找到該類。

2

當我使用type作爲列名時,我有這個相同的問題,也許嘗試將您的列名重命名爲別的東西?

2

列名'type'在ActiveRecord中受到限制。嘗試將列名重命名爲其他內容或者如果您無法嘗試此操作:

self.inheritance_column = :_type_disabled