2010-09-24 74 views
1

我有以下型號:我得到驗證錯誤「活動不能爲空」活動工廠:factory_girl的has_many:通過與驗證

class Activity < ActiveRecord::Base 
    has_many :clientships, :dependent => :destroy 
    has_many :clients, :through => :clientships 
end 

class Clientship < ActiveRecord::Base 
    belongs_to :client 
    belongs_to :activity 

    validates_presence_of :client_id 
    validates_presence_of :activity_id, :unless => :new_record? 
end 

class Client < ActiveRecord::Base 
    has_many :clientships 
    has_many :activities, :through => :clientships 
end 

我不能創建一個。

我的工廠是這樣的:

Factory.define :activity do |a| 
    a.association :staff, :factory => :user 
    a.clientships { |cs| [cs.association :clientship] } 
end 

Factory.define :clientship do |cs| 
    cs.association(:client) 
end 

Factory.define :client do |c| 
    c.first_name {Factory.next(:name)} 
    c.last_name {Factory.next(:name)} 
end 

我得到的錯誤,當我在我的規格運行這個廠: @activity = Factory(:activity)

請幫助!

+2

「客戶」?我會選擇「ClientActivity」......聽起來更自然。 – 2010-09-24 07:11:09

回答

3

我總是做這樣的情況是這樣的:

Factory.define :activity do |a| 
    #whatever attributes 
end 

Factory.define :clientship do |cs| 
    cs.association(:client) 
    cs.association(:activity) 
end 

Factory.define :client do |c| 
    c.first_name {Factory.next(:name)} 
    c.last_name {Factory.next(:name)} 
end 

所以,在我的測試/規格我用

Factory :clientship 

也許是不那麼幹淨,但更有道理到我......但我不確定從連接表創建這樣的關係是一個好主意。

而且,一般來說,我更願意在belongs_to這一方的工廠裏創建協會,因爲最終它對我來說不會造成問題。

+0

感謝您的回答。我也做類似於你描述的方法。在這種情況下唯一的問題是活動模型中的驗證錯誤... – Coderama 2010-09-24 08:20:48

+1

是的,您使用類似的方式,但在這裏'a.clientships {| cs | [cs.association:clientship]}'你用默認工廠創建一個客戶關係,但不包含一個活動。這就是爲什麼你會得到驗證錯誤。你需要在創造生活之前創造活動,你正在做另一個周圍的事情。 – Fran 2010-09-24 10:23:55

+0

啊,我感到困惑。你完全正確。謝謝! – Coderama 2010-09-24 23:34:19