19

私は標準的なhas_many関係 (予約には多くの注文があります) を持っており、少なくとも 1 つの注文がないと予約が保存されないという検証が行われています。これを FactoryGirl ファクトリで複製しようとしていますが、検証により複製できません。

class Booking < ActiveRecord::Base
  has_many :orders
  validates :orders, presence: true
end

class Order < ActiveRecord::Base
  belongs_to :booking
end

以下は、FactoryGirl の GitHub wiki ページにある、各モデルの FactoyGirl 工場仕様です。

FactoryGirl.define do                                                    

  factory :booking do                                                                                                                   
    factory :booking_with_orders do

      ignore do                                                                                                                         
        orders_count 1                                                                                                                  
      end                                                                                                                               

      before(:create) do |booking, evaluator|                                                                                           
        FactoryGirl.create_list(:order, evaluator.orders_count, booking: booking)                                                       
      end                                                                                                                               
    end                                                                                                                                 
  end 

  factory :order do
    booking
  end

end 

FactoryGirl.create(:booking_with_orders)スペックから実行しようとすると、次のようになります。

Failure/Error: @booking = FactoryGirl.create(:booking_with_orders)
ActiveRecord::RecordInvalid:
  Validation failed: Orders can't be blank

before(:create) [...]理論的には予約の注文を作成する前に、検証のチェックが実行されているようです。

この投稿では、工場に関係を追加しないことをお勧めhas_manyしますが、それを行う良い方法があれば、とにかくこれを解決したいと思います.

前もって感謝します。

4

3 に答える 3

36

ワット?不可能?全くない。

コードを次のように変更するだけです。

after :build do |booking, evaluator|
  booking.orders << FactoryGirl.build_list(:order, evaluator.orders_count, booking: nil)
end
于 2013-05-07T01:19:14.380 に答える
2

@jassaの回答から出発して、特定の属性を持つ単一の(必須の)関連レコードを追加する必要があるだけの場合、このパターンは私にとってはうまくいきました:

factory :booking do
  ignore do
    order_name "name"
  end

  after :build do |factory, evaluator|
    factory.orders << FactoryGirl.build(:order, name: evaluator.order_name, booking: nil)
  end
end
于 2013-12-11T14:05:11.630 に答える
0

これは非常に単純化された観察のように思えますが、あなたがやろうとしていることは事実上、 が の前に存在することを確認するOrderことです。BookingOrderbooking_idBooking

工場の has_many 関係に問題はありません。問題は検証です。これは現在、アプリケーションで機能していますか? その場合、どのように記録を保存しますか?注文と予約を作成する流れは?

悪名高い者でさえ、accepts_nested_attributes_forここではあなたを助けません。

私のアドバイスは、レコードの保存と検証の戦略を再考して、もう少し正気になるようにすることです。

于 2012-12-13T18:35:16.030 に答える