我的应用程序有一个逻辑: 保存前的父模型生成子模型元素。
我想在保存父元素之前验证它至少有一个子元素。
我尝试过使用validates_presence_of,但是在之前调用了#before;之前调用了所以父母没有子元素。
您能告诉我应该在哪里生成子元素以及验证是否存在子元素?
答案 0 :(得分:2)
如果我误解了你的问题,请纠正我,但你想在父模型触发'before_save'回调之前检查父模型是否至少有1个孩子(这会做任何想做的事),对吧?
如果是,您可以使用'before_validation'回调。在'before_save'之前调用'before_validation'。所以你可以这样做:
before_validation { self.errors.add(:base, 'error here or something') if self.children.count < 1 }
请注意,如果资源的'errors'数组不为空,则rails甚至不会尝试保存资源(因此不会调用before_save回调)。在'before_save'回调中执行'self.errors.add'不会阻止资源被保存。如果要阻止资源从'before_save'回调中保存,您可以执行以下操作:
before_save do
self.errors.add(:base, 'error here or something')
false
end
希望有所帮助。 :)
干杯!
答案 1 :(得分:0)
这样的事情:
class Hero < ActiveRecord::Base
has_many :weapons
before_save :check_equipment
private
def check_equipment
errors.add(:weapons, "are not equipped") if weapons.size < 1
end
end
class Weapon < ActiveRecord::Base
belongs_to :hero
end
您可以将武器创建为独立对象,然后将武器与英雄相关联,或者您也可以使用accepts_nested_attributes_for
方法与英雄创建武器。解决方案取决于您的应用程序架构。