0

У меня есть модель base_table, и у меня есть extended_table, которая имеет дополнительные свойства для дальнейшего расширения моего base_table. (У меня бы были разные extended_tables, чтобы добавить разные свойства в мою base_table, но это не связано с вопросом, который я задаю здесь).rails callback перед «новым» модели?

Определение модели для моего 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, прежде чем 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