嵌套属性无法使用新父级创建子级

时间:2014-04-10 14:47:23

标签: ruby-on-rails ruby-on-rails-3 nested-attributes

我有两种模式:

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为我做了这件事。

问题是:为什么我需要删除该验证才能使其正常工作?

1 个答案:

答案 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