【问题标题】:rails 4 extend the build methodrails 4 扩展了构建方法
【发布时间】:2013-10-10 12:27:36
【问题描述】:

我想扩展 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

【问题讨论】:

  • 是否要覆盖 Rails 提供的默认 build 方法?
  • 此错误意味着您的event_log 对象没有与之关联的event 对象。
  • 是的,这将是我对这个模型的偏好,除非有什么理由不这样做。
  • 但是当您在event_log 模型中调用event 时,它根本不知道event 是什么。
  • 是的,我明白了,但除了 event.event_logs.auto_build(model) 之外,我不确定如何传入模型...

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


【解决方案1】:

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

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 

【讨论】:

  • 正是我需要的。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    也许你可以试试这样的:

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

    例如:

    # config/initializers/active_relation_helper.rb
    
    module ActiveRelationHelper
    
      def build(attribute_hash = {})
        # Your content
      end
    
      ActiveRecord::Relation.send(:include, ActiveRelationHelper)
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 2014-05-11
      • 2013-07-20
      相关资源
      最近更新 更多