我有两种模式:
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
如果我从validates :shift, presence: true
模型中移除Range
,则效果非常好。我能够和他的孩子一起创造一个新的转变。 ActiveRecord
为我做了这件事。
问题是:为什么我需要删除该验证才能使其正常工作?
答案 0 :(得分:2)
验证这样的父母存在的事情是时间 !!实际上Shift
尚未保存,因此在尝试创建嵌套ranges
时,它将无法在数据库中找到父Shift
。
我发现此解决方法here
class Shift < ActiveRecord::Base
attr_accessible :ranges_attributes
has_many :ranges, :inverse_of => :shift
accepts_nested_attributes_for :ranges, allow_destroy: true
end
我从相同的来源引用(稍作修改):
使用此选项时,rails不会尝试从数据库获取父级 孩子有效。父母将从记忆中获得。如果你不这样做 熟悉这个选项我强烈建议你阅读一位官员 rails guide