2014-01-26 57 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 
相關問題