4 votes

associations has_and_belongs_to_many dans factory_girl 4.1

Je suis nouveau dans factory_girl et j'essaie de comprendre comment générer efficacement une usine pour les modèles suivants :

class Company < ActiveRecord::Base
    has_and_belongs_to_many :tags
end

class Tags < ActiveRecord::Base
    has_and_belongs_to_many :companies

    validates :type , :inclusion => { :in => %w(market location) } 
end

J'ai jeté un coup d'œil aux réponses précédentes sur StackOverflow (y compris celui-ci ), mais la plupart d'entre eux sont obsolètes et/ou n'apportent pas de réponse adéquate à la question. Y a-t-il quelqu'un qui peut m'aider à définir des usines pour ces deux objets avec Factorygirl ?

Mise à jour

Voici ce que j'ai trouvé jusqu'à présent

FactoryGirl.define do
factory :tag do
    id  448
        trait :market do
        type "market"
    end
    trait :location do
        type "location"
    end
    name "software"
end

factory :company do
    id  1234
    name "Apple Inc."
    factory :company_with_tags do
        #setting the default # of tags for companies
        ignore do
            tag_count   2
        end

            after(:create) do |company , evaluator|
                FactoryGirl.create_list(:tag , evaluator.tag_count , company: company)
            end 
    end
end
end

2voto

zetetic Points 29261

Je pense que le problème vient du fait que le nom de l'association est mal spécifié. A Tag a plusieurs entreprises, pas une seule, donc :

after(:create) do |company , evaluator|
  FactoryGirl.create_list(:tag , evaluator.tag_count , companies: [company])
end

Par ailleurs, il est préférable d'éviter d'utiliser la fonction type comme nom de colonne, à moins que vous n'essayiez d'établir une relation polymorphe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X