0

我正在尝试使用 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 对象的数量?

4

2 回答 2

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
于 2012-10-30T14:39:29.003 回答
1

事实证明,这个问题是我没有在我的问题中概述的。我已经定义了以下内容:

class Enrollment < ActiveRecord::Base
  belongs_to :line_item

  attr_accessible :variant
  attr_accessor   :variant
end

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

于 2012-10-30T19:56:05.090 回答