2017-07-24 87 views
1

我遇到問題正確設置我的工廠has_many/has_many通過或has_and_belongs_to_many與驗證關聯。客戶模型/工廠已被省略,但它確實存在。通過與驗證相關聯來設置has_many到has_many的最佳方式是什麼?在哪裏需要傳遞屬性?工廠女孩has_many/has_many通過驗證

我已經嘗試了幾種使它無法成功工作的方法。目前的相關代碼如下(略有改動)。嘗試了其他方法:在client_team之後(:create)和之前(:create)創建user_clients,定義關聯的client_teams和user_clients上的traits,使用build_list/create_list代替鏟運算符。

ClientTeam型號:

belongs_to :client 
has_many :client_team_rosters 
has_many :users, through: :client_team_rosters 

用戶模式:

belongs_to :client 
has_many :client_team_rosters 
has_many :client_teams, through: :client_team_rosters 
validates_presence_of :client_teams 

ClientTeamRoster型號:

belongs_to :user 
belongs_to :client_team 

相關工廠:

factory :client_team do 
    client 
    team_name "stuff" 
end 

factory :client_team_roster do 
    client 
    user 
end 

factory :user do 
    ... 
    factory :user_client do 
    client 

    before(:create) do |user_client| 
    client_team = user_client.client.client_teams.first 
    user_client.client_team_rosters << FactoryGirl.build(:client_team_roster, user: user_client, client_team: client_team) 
    end 
    end 
end 

規格文件:

before(:each) do 
    @client = create(:client) 
    @client_team = create(:client_team, client: @client) 
end 

it "should do something" do 
    user_client = create(:user_client, client: @client) 
end 

當前出錯:

Validation failed: Client_teams can't be blank 

回答

0

哎,這張貼後這樣吧,我決定做一個小的調整,它結束了工作。相反,刪除的問題我就張貼我的修補程序,以幫助其他人在未來(希望用更少的試錯)內user_client工廠

,更改回調:

before(:create) do |user_client| 
client_team = user_client.client.client_teams.first 
user_client.client_teams << client_team 
end 

模仿如何否則我們在代碼庫中設置我們的模型。我可以發誓我早些時候發佈了這個版本,但是這次嘗試了一下。

編輯:我們也有一個工廠繼承自:user_client。在這些情況下,before(:create)似乎不會觸發。但是,在創建/構建這些繼承的工廠時可以使用以下命令初始化:client_teams => [client_team]