1

私は次の2つのモデルを持っています:

class Parent < ActiveRecord::Base
  has_one :child, dependent: :destroy
  validates :child, presence: true
end

class Child < ActiveRecord::Base
  belongs_to :parent
  validates :parent, presence: true
end

親オブジェクトを作成したい。

次の場合: Parent.create!またはFactory(:parent)
例外が発生します:ActiveRecord::RecordInvalid: Validation failed: Child can't be blank

しかし、同じ理由で親オブジェクトなしで子オブジェクトを作成することはできません-プレゼンス検証に合格するには、最初に親オブジェクトを作成する必要があります。どうやら、ここにはある種の無限再帰があります。

それを解決する方法は?

4

1 に答える 1

2

アップデート:

以下のコードは私の環境でうまく機能します(Rails3.2.2、ruby 1.8.7)

# parent.rb
class Parent < ActiveRecord::Base
  has_one :child
  validates :child, :presence => true
end
# child.rb
class Child < ActiveRecord::Base
  belongs_to :parent
  validate :parent, :presence => true
end

# parent_test.rb
require 'test_helper'
class ParentTest < ActiveSupport::TestCase
  test "should be saved" do 
    parent = Parent.new(:name => "111")
    child = Child.new(:name => "222", :parent => parent)
    parent.child = child
    parent.save!
    puts "after saved, parent: #{parent.inspect}"
    puts "after saved, child: #{child.inspect}"
    assert parent.id > 0
    assert child.id > 0
  end
end

このテストを実行して、次のようになりました。

Started
after saved, parent: #<Parent id: 980190963, name: "111", created_at: "2012-04-05 23:19:31", updated_at: "2012-04-05 23:19:31">
after saved, child: #<Child id: 980190963, name: "222", parent_id: 980190963, created_at: "2012-04-05 23:19:31", updated_at: "2012-04-05 23:19:31">
.
Finished in 0.172716 seconds.

1 tests, 2 assertions, 0 failures, 0 errors

前の回答================

それらを個別に初期化してから、関連付けを追加し、最後にそれらを保存してみてください。

parent = FactoryGirl.build(:parent)
child = FactoryGirl.build(:child, :parent => parent)
parent.child = child

parent.save
child.save  # seems this line of code is redundant?  I am not sure. 

「ビルド、作成」の詳細については、公式Webサイトを参照してください:https ://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md

于 2012-04-05T22:30:38.493 に答える