【问题标题】:rails callback before 'new' of a model?模型的“新”之前的rails回调?
【发布时间】:2014-01-26 04:50:23
【问题描述】:

我有一个模型base_table,我有一个extended_table,它具有进一步扩展我的base_table 的额外属性。 (我会有不同的扩展表,以向我的 base_table 添加不同的属性,但这与我在这里提出的问题无关)。

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_table 也被实例化。

我能想出的一个解决方法是在调用参数 TennisQuestionaire.new 之前解析参数以创建 base_table 对象。这就像在这里有一个“before_new”过滤器。但是我在阅读文档时找不到这种过滤器。

此外,我认为另一种方法是覆盖“新”方法。但这不是那么干净。

注意:有一种方法称为 accepts_nested_attributes_for,似乎可以满足我的要求,但它不适用于 belongs_to 关系。

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

【问题讨论】:

  • 看来您应该颠倒关系并改用has_one

标签: ruby-on-rails activerecord ruby-on-rails-4 rails-models


【解决方案1】:

经过一些跟踪和错误后,解决方案是这样的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多