在创建父母的同时更新子记录?

时间:2011-12-01 16:07:17

标签: ruby-on-rails validation activerecord associations nested-attributes

在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。

有人遇到过这样的问题吗?

1 个答案:

答案 0 :(得分:1)

如果可能,您可以在表单中放入一个隐藏字段,其中包含user_id吗?您可能需要在after_save中进行一些验证和潜在的回滚,但看起来可能很容易。

另一种选择可能是在调用父对象上的save / create之前,为控制器中的params散列中的所有相关对象设置user_id。