关联不会保存在before_validation中

时间:2012-10-30 13:58:02

标签: ruby-on-rails ruby-on-rails-3 activerecord

我正在尝试使用before_validation回调来调整记录的子对象的数量,但由于某种原因,它不按我期望的方式工作。

LineItem类:

 before_validation :adjust_enrollment_count

 def adjust_enrollment_count
    if enrollments.size < quantity 
      (enrollments.size+1..quantity).each do |li|
        self.enrollments.build(variant: self.variant)
      end
      #self.save
    elsif enrollments.size > quantity
      enrollments.delete_if do |e| 
        enrollments.size > quantity
      end
    end
  end

它会创建正确数量的Enrollment对象作为LineItem的子项,但Variant设置为nil(即使LineItem已定义了变体)。

我尝试过的事情:

  • 明确保存line_item或注册
  • “撬”回调并手动运行代码(这实际上是有效的 我期待!)
  • 验证“self”是指LineItem而不是闭包

我是否缺少回调生命周期?有没有更好的方法来调整LineItem上数量变化的Enrollment对象数量?

2 个答案:

答案 0 :(得分:1)

可能variant不是Enrollment类的可访问字段。试试这种方式(也缩短)

def adjust_enrollment_count
  while enrollments.size < quantity 
    self.enrollments.build(variant_id: self.variant) # note: variant_id
  end
  while enrollments.size > quantity
    enrollments.pop # or .shift to delete from the head of the list
  end
  # don't save in a lifecycle callback, or you'll get in an awful loop
end

编辑:不同的拍摄

def add_enrollment
  enrollments.build(variant_id: variant)
end

def adjust_enrollment_count
  enrollments.slice!(quantity, enrollments.size)
  add_enrollment while enrollments.length < quantity
end

答案 1 :(得分:1)

事实证明,问题是我在问题中未提出的问题。我定义了以下内容:

class Enrollment < ActiveRecord::Base
  belongs_to :line_item

  attr_accessible :variant
  attr_accessor   :variant
end

我认为attr_accessor正在创建一个名为variant的内存变量,该变量只持续与页面加载一样长。我删除了它,似乎解决了这个问题。