2011-03-03 64 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 –

相关问题