2014-03-29 64 views
4
的子類

我試圖記錄用戶通過用戶和事務之間的多對多關係進行的每次購買,並通過連接表「transactuins_users」鏈接它們。但我有兩個問題,首先,我需要提供創建!方法與它被稱爲id的對象相關,我認爲Rails本身應該考慮到這一點。無效的單表繼承類型..不是

此外,每當我打電話購買法,我收到一個錯誤「無效的單表繼承類型:買的是不是交易的一個子類」

class User < ActiveRecord::Base 

    # Associations 
    has_and_belongs_to_many :transactions 

    def purchase(package) 
    return false unless funds_available?(package) and !owns?(package) 
     package.with_lock do 

     # Makes transaction 
     package.user_id = id 
     package.save! 
     withdraw(package.cost) 

     # Records transaction 
     values = {user_id: id, type: "buy", cost: package.cost} 
     transactions.create values 
    end 
    end 


class Transaction < ActiveRecord::Base 

    # Associations 
    has_and_belongs_to_many :transactions 

    # Validations 
    validates :user_id, :cost, presence: true 

回答

13

活動記錄有一定的schema conventions即使用爲不同行爲。其中一種慣例是當你想在模型中使用單個表繼承時,使用列名「type」。它看起來不像你打算使用STI,所以我建議只將列的名稱改爲「kind」或「category」等其他名稱。

如果您計劃對各種類型的事務具有不同的行爲,那麼您可能最好考慮使用單表繼承。

+0

好,很酷,得到它的工作,但我仍然不明白爲什麼我手動必須通過user_id屬性? – manis

+0

您在交易模型中缺少'belongs_to:user'。 –

9

self.inheritance_column = nil添加到您的模型中。類型是保留的。這將允許您使用它。

4

我有同樣的錯誤。您現在必須已經解決了它,但如果其他人正在尋找它,我的域名爲type,與問題中相同。

type是保留字,用於繼承。因此,當您使用type: "buy"時,它會嘗試查找buy模型,並且預計buy模型將從用戶繼承。

我會分享我的日誌,以便更好地理解:

Parameters: {"step"=>{"type"=>"Email Template", "step_name"=>"Step name", "no_of_days"=>20, "cadence_id"=>nil, "email_template_id"=>nil}} 

Completed 500 Internal Server Error in 238ms 

ActiveRecord::SubclassNotFound (Invalid single-table inheritance type: Email Template is not a subclass of Step): 
    app/controllers/steps_controller.rb:15:in `create' 

如果你仍然需要保持田間名type,我相信加入self.inheritance_column = niluser模型可能會有幫助。沒試過。雖然我的建議是遵循軌道慣例並避免它。

你可以找到更多的細節here

希望這可以幫助別人。乾杯:)