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
現在:
工作那是很好的,我想這意味着你可以使用AR驗證檢查類型是允許的類型之一。唯一的缺點是所提供的參數的形式爲params [:child_model],因此我不知道它們是什麼(僅在params [:type]的幫助下)。我想我可以注入這個參數到:child_model哈希雖然:) –
這不適合我在rails 3.1.rc8 :( –
根據apidock,這種方法被轉移到ActiveRecord :: MassAssignmentSecurity,所以沒有辦法從模型中設置。http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods/attributes_protected_by_default –