2

我想扩展 build 方法或创建另一个方法,该方法自动使用父级的属性预先填充子模型。

我目前每次都在控制器中执行此操作...

@event_log = @event.event_logs.build(
  place_id: @event.place_id, quiz_master_id: @event.quiz_master_id,
  start_at: Chronic.parse("#{params[:start_at]} #{@event.start_time}")
  )

我想将此逻辑移至模型中:

  def self.auto_build
    build(place_id: event.place_id, .....)
  end

但我得到一个错误..undefined method event

我不确定如何仅覆盖此模型的构建或创建类似的方法:

# File 'activerecord/lib/active_record/associations/builder/association.rb', line 11

def self.build(model, name, options)
  new(model, name, options).build
end
4

3 回答 3

2

您可以为此使用关联扩展:

has_many :event_logs do
  def build(*args)
    event_log = super
    # do with event_log object whatever you want here
    # you can access parent object with proxy_association.owner
    event_log
  end 
于 2013-10-10T14:57:35.517 回答
1

我不确定如何在子模型中完成此操作,但从您的控制器中读取您可以在父模型中执行此操作:

def build_event_log
  event_logs.build(
    place_id: place_id, 
    quiz_master_id: quiz_master_id
    ...
  )
end
于 2013-10-10T13:24:58.977 回答
0

可能你可以尝试一些这样的:

要创建新方法或覆盖默认构建方法,请创建一个模块并将其放在 config/inittailizers 中,

例如:

# config/initializers/active_relation_helper.rb

module ActiveRelationHelper

  def build(attribute_hash = {})
    # Your content
  end

  ActiveRecord::Relation.send(:include, ActiveRelationHelper)
end
于 2013-10-10T12:58:04.860 回答