rails 4扩展了构建方法

时间:2013-10-10 12:27:36

标签: ruby-on-rails ruby ruby-on-rails-3 model ruby-on-rails-4

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

我现在每次都在控制器中这样做......

@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

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分:1)

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

def build_event_log
  event_logs.build(
    place_id: place_id, 
    quiz_master_id: quiz_master_id
    ...
  )
end

答案 2 :(得分:0)

也许你可以试试这样的:

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

对于Ex:

# config/initializers/active_relation_helper.rb

module ActiveRelationHelper

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

  ActiveRecord::Relation.send(:include, ActiveRelationHelper)
end