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 –