我正在尝试使用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已定义了变体)。
我尝试过的事情:
我是否缺少回调生命周期?有没有更好的方法来调整LineItem上数量变化的Enrollment对象数量?
答案 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的内存变量,该变量只持续与页面加载一样长。我删除了它,似乎解决了这个问题。