在Rails中,如何在保存子级或父级之前使用其父级的值更新子记录?
我正在使用Rails的嵌套属性来创建包含许多子项的父记录。父记录具有user_id属性以跟踪其所有者,并且出于此问题范围之外的目的,子记录 还需要存储此user_id属性。
目前,我在子模型上使用了before_save回调:
before_save :set_user_id
def set_user_id
if user = self.parent.try(:user)
self[:user_id] = user.id
end
end
但是因为我还需要确保孩子对于给定的父/用户组合是唯一的,我必须这样做:
validates :parent,
:uniqueness => {:scope => :user_id},
:unless => Proc.new{|child| child.user_id.blank?}
问题是unless
参数。在验证之后,孩子的user_id
attr是空白的,因此有效的验证不会在子项创建时运行。如果用户双重提交表单,这会导致问题;结果是重复的,无效的订阅最终在数据库中。我试图通过改变这个来解决这个问题:
before_save :set_user_id
到
before_validate :set_user_id
但似乎在验证之前无法访问父级的user_id。
有人遇到过这样的问题吗?
答案 0 :(得分:1)
如果可能,您可以在表单中放入一个隐藏字段,其中包含user_id吗?您可能需要在after_save中进行一些验证和潜在的回滚,但看起来可能很容易。
另一种选择可能是在调用父对象上的save / create之前,为控制器中的params散列中的所有相关对象设置user_id。