2014-01-26 31 views
0

我有一个模型base_table,并且我有一个extended_table,它有其他属性可以进一步扩展我的base_table。 (我会有不同的extended_tables,为我的base_table添加不同的属性,但这与我在此问的问题无关)。在模型的“新”之前回调rails?

模型定义了我的base_table是这样的:

class BaseTable < ActiveRecord::Base 
    module BaseTableInclude 
    def self.included(base) 
     base.belongs_to :base_table, autosave:true, dependent: :destroy 
     # do something more when this module is included 
    end 
    end 
end 

而且我extended_table模型的定义是这样的:

class TennisQuestionaire < ActiveRecord::Base 
    include BaseTable::BaseTableInclude 
end 

现在我什么,我要的是下面的代码:

params = {base_table: {name:"Songyy",age:19},tennis_ball_num:3} 
t = TennisQuestionaire.new(params) 

当我创建我的t时,我想要base_ta也可以被实例化。

我可以想出一个解决办法,就是解析参数以创建base_table对象,然后在Params上调用TennisQuestionaire.new。这就像在这里有一个“before_new”过滤器。但是当我阅读文档时,我找不到这样的过滤器。

此外,我认为另一种方法是重写'新'方法。但这并不是那么干净。

注意:有一种方法称为accepts_nested_attributes_for,似乎做我想要的,但它不起作用于belongs_to关系。

任何建议,将不胜感激。谢谢:)

+0

好像你应该反向的关系,并使用'has_one'代替。 – thomasfedb

回答

0

一些创新&错误后,解决的办法是这样的:

class BaseTable < ActiveRecord::Base 
    module BaseTableInclude 
    def initialize(*args,&block) 
     handle_res = handle_param_args(args) { |params| params[:base_table] = BaseTable.new(params[:base_table]) } 
     super(*args,&block) 
    end 

    private 
    def handle_param_args(args) 
     return unless block_given? 

     if args.length > 0 
     params = args[0] 
     if (params.is_a? Hash) and params[:base_table].is_a? Hash 
      yield params 
     end 
     end 
    end 
    end 
end 
相关问题