2

ネストされたモデルフォームのネストされた構造内のモデル間で検証を行う方法はありますか?私が使用しているネストされた階層では、子モデルが親の属性を参照して検証を実行します。検証はボトムアップで行われるため(子モデルが最初に検証されます)、子には親への参照がなく、検証は失敗します。例えば:

# encoding: utf-8
class Child < ActiveRecord::Base
  attr_accessible :child_attribute
  belongs_to :parent
  validate :to_some_parent_value

  def to_some_parent_value
    if child_attribute > parent.parent_attribute # raises NoMethodError here on ‘parent’
      errors[:child_attribute] << "Validation error."
    end
  end
end

class Parent < ActiveRecord::Base
  attr_accessible :parent_attribute
  has_one :child
  accepts_nested_attributes_for :child
end

コンソールの場合:

> p=Parent.new( { "parent_attribute" => "1", "child_attributes" => { "child_attribute" => "2" }} )
> p.valid?
=> NoMethodError: undefined method `parent_attribute' for nil:NilClass

子が親の値を参照し、Railsネストモデルフォーム機能を引き続き使用するこの種の検証を行う方法はありますか?

4

1 に答える 1

1

編集:うーん、私はあなたの投稿を少し速すぎて読んだ、私はあなたwhere the child references a value in the parentが外部キーを意味していると思ったparent_id...私の答えはまだ役立つかもしれない、確かではない。

私はあなたがオプションを探していると思いますinverse_of。それを試してください:

class Parent < ActiveRecord::Base
    has_one :child, inverse_of :parent
end

class Child < ActiveRecord::Base
    belongs_to :parent, inverse_of :child
end

ドキュメントから:

親モデルの存在を検証する

子レコードが親レコードに関連付けられていることを検証する場合は、次の例に示すように、validates_presence_ofとinverse_ofを使用できます。

class Member < ActiveRecord::Base
    has_many :posts, :inverse_of => :member
    accepts_nested_attributes_for :posts
end

class Post < ActiveRecord::Base
    belongs_to :member, :inverse_of => :posts
    validates_presence_of :member
end
于 2012-09-04T21:42:49.577 に答える