7

このように定義されたモデルがあります

class Lga < ActiveRecord::Base
  validates_uniqueness_of :code
  validates_presence_of :name
end 

Lgas のファクトリを次のように定義しました。

Factory.sequence(:lga_id) { |n| n + 10000 }

Factory.define :lga do |l|
  id = Factory.next :lga_id
  l.code "lga_#{id}"
  l.name "LGA #{id}"
end

ただし、実行すると

Factory.create(:lga)
Factory.create(:lga)

私はscript/console得る

>> Factory.create(:lga)
=> #<Lga id: 2, code: "lga_10001", name: "LGA 10001", created_at: "2010-03-18  23:55:29", updated_at: "2010-03-18 23:55:29">
>> Factory.create(:lga)
ActiveRecord::RecordInvalid: Validation failed: Code has already been taken
4

2 に答える 2

7

問題はcodename属性がいわゆる遅延属性ではないことでした。私は次のようなものを書くことを考えていました:

Factory.define :lga do |l|
  l.code { |n| "lga_#{n+10000}" }
end

nameしかし、属性でもIDを再利用したかったのです。フックに入れることで、 が呼び出されるidたびに評価されることを確認できます。Factory.createafter_build

Factory.define :lga do |l|
   l.after_build do |lga|
     id = Factory.next :lga_id
     lga.code = "lga_#{id}"
     lga.name = "LGA #{id}"
   end
end

これは FactoryGirl 1.2.3 以降でのみ機能します。

于 2010-03-19T00:03:53.760 に答える
2

前の回答はまだ正しいですが、FactoryGirl の新しいバージョンでは警告が表示されます。

Factory.next has been depreciated. Use FactoryGirl.generate instead.

新しいコードは次のようになります。

Factory.define :lga do |l|
   l.after_build do |lga|
     id = FactoryGirl.generate :lga_id
     lga.code = "lga_#{id}"
     lga.name = "LGA #{id}"
   end
end

ソース: http://notesofgreg.blogspot.co.uk/2012/07/foolproof-factorygirl-sequence.html

于 2012-07-10T13:19:22.840 に答える