我有两种型号:
class Shift < ActiveRecord::Base
attr_accessible :ranges_attributes
has_many :ranges
accepts_nested_attributes_for :ranges, allow_destroy: true
end
class Range < ActiveRecord::Base
belongs_to :shift
validates :shift, presence: true
end
当在我的控制器中,我想用我得到的范围创建一个偏移时:
Shift.create! params[:shift]
#ActiveRecord::RecordInvalid Exception: Validation failed: Shift ranges shift can't be blank
如果我从Range
模型中删除validates :shift, presence: true
,这将非常有效。我可以和他的孩子们一起创造一个新的转变。ActiveRecord
为我做这件事。
问题是:为什么我需要删除该验证才能使其工作
像这样验证父级存在的问题是计时!!实际上Shift
还没有保存,所以当尝试创建嵌套的ranges
时,它在数据库中找不到父Shift
。
我在这里找到了这个解决方法
class Shift < ActiveRecord::Base
attr_accessible :ranges_attributes
has_many :ranges, :inverse_of => :shift
accepts_nested_attributes_for :ranges, allow_destroy: true
end
我引用了来自同一来源的(略有修改):
使用此选项时,rails不会尝试从数据库获取父项验证子项。父对象将从内存中获取。如果你不这样做熟悉这个选项,我强烈建议你阅读官方导轨