2017-07-24 4 views
1

Je rencontre des problèmes en configurant correctement mes usines pour un has_many/has_many à travers ou has_and_belongs_to_many association avec des validations. Le modèle client/usine a été omis, mais il existe. Quelle est la meilleure façon de configurer has_many à has_many en associant des validations, où les attributs doivent être transmis?Factory Girl has_many/has_many à travers avec la validation

J'ai essayé quelques méthodes pour le faire fonctionner sans succès. Le code pertinent actuel est ci-dessous (légèrement modifié). D'autres méthodes ont essayé: after (: create) et before (: create) sur client_team pour créer user_clients, traits sur client_teams et user_clients qui définissent l'association, en utilisant build_list/create_list à la place de l'opérateur shovel.

modèle ClientTeam:

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

modèle utilisateur:

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

modèle ClientTeamRoster:

belongs_to :user 
belongs_to :client_team 

usines pertinentes:

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 

fichier Spec:

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 

erreur actuelle:

Validation failed: Client_teams can't be blank 

Répondre

0

Ugh, si juste après la publication, je décide de faire un petit coup sec et il a fini par travailler. Au lieu de supprimer la question que je vais poster mon correctif pour aider les autres à l'avenir (je l'espère avec moins tâtonnement)

Au sein de l'usine de user_client, changer la fonction de rappel à:

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

mimant comment nous mettons en place nos modèles dans le codebase sinon. J'aurais pu jurer que je l'avais essayé plus tôt, mais je l'ai essayé cette fois-ci.

Editer: Nous avons aussi une usine qui hérite de: user_client. Dans ces cas, l'avant (: create) ne semble pas déclencher. Cependant, ces usines héritées peuvent être initialisées avec: client_teams => [client_team] lors de la création/construction