Ruby on Rails:在create上访问嵌套(父)对象

时间:2011-10-25 04:09:22

标签: ruby-on-rails ruby

我正在尝试使用与之关联的嵌套子对象集创建父对象,但是我不确定如何在对象之前访问子对象的验证方法中的父对象(其他子对象)。持续存在。简而言之,这是我的情景:

class Parent < ActiveRecord::Base
  has_many :children
end

class Child < ActiveRecord::Base
  belongs_to :parent
  validate :siblings_validation

  def siblings_validation
    siblings = parent.children #parent is Nil here on create (but not on update)
    # compare stuff...
  end
end

使用标准的嵌套表单集创建关联,如下所示:

- form_for @parent do |f|
  = f.text_field :name
  - f.fields_for :children do |c|
    = render :partial => "child_fields", :locals => {:f => c}

有没有办法从子对象的 siblings_validation 方法访问父级?

感谢您的回复。

3 个答案:

答案 0 :(得分:2)

直到保存父模型,您无权访问它。当我必须验证嵌套模型时,我遇到了同样的问题。但是您可以从父级访问子模型。因此,尝试通过父模型进行验证。或者您可以创建一些attr_accessible并在子模型中使用它以进行验证。

答案 1 :(得分:0)

如果在控制器中使用显式.build,则可以创建一个实例化但尚未保存的子对象:

def new
  @parent = Parent.new
  @parent.children.build
end

实例化对象应该能够引用它的父节点并检测它的兄弟节点,尽管它不会在@parent对象的.children列表中结束,直到它被保存为止。< / p>

答案 2 :(得分:0)

你到底想要验证什么?

您是否可以在自己的类中保留Parent模型的验证并在Child中使用validates_associated :parent