2011-03-03 87 views
1

通常人們會通過它的父對象建立相關模型實例:什麼是更好的方式來創建STI模型實例

@child = @parent.children.build(params[:child]) 

但我們正在使用STI的時候,我們希望在同一做到這一點,而將其作爲語法似乎分解的子類之一進行構建。這是做的最好的辦法,據我可以告訴(約忽略安全問題不檢查的類型與批准的列表):

@child = params[:type].classify.constantize.new(params[params[:type]]) 
@child.parent = @parent 

這是去了解它的最佳方式?我使用單個控制器來構建所有不同的子類型,因此我需要提供該類型作爲參數。在您的控制器

class BaseModel < ActiveRecord::Base 

private 
    # this will enable you to set the type field 
    def attributes_protected_by_default 
    super - [self.class.inheritance_column] 
    end 
end 

現在:

回答

0

我通常使用這一招

@parent.children.build(params[:base_model]) 

確保PARAMS [:base_model]哈希有一個字段名爲type。我通常會添加一個隱藏的表單字段來存儲該類型。

確保您添加相關檢查以確保創建正確的子類型。

注意:這招不會對Rails 3

+0

工作那是很好的,我想這意味着你可以使用AR驗證檢查類型是允許的類型之一。唯一的缺點是所提供的參數的形式爲params [:child_model],因此我不知道它們是什麼(僅在params [:type]的幫助下)。我想我可以注入這個參數到:child_model哈希雖然:) –

+0

這不適合我在rails 3.1.rc8 :( –

+0

根據apidock,這種方法被轉移到ActiveRecord :: MassAssignmentSecurity,所以沒有辦法從模型中設置。http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods/attributes_protected_by_default –

相關問題