Dado o seguinte
class User < ActiveRecord::Base
has_and_belongs_to_many :companies
end
class Company < ActiveRecord::Base
has_and_belongs_to_many :users
end
como você define fábricas para empresas e usuários, incluindo a associação bidirecional? Aqui está a minha tentativa
Factory.define :company do |f|
f.users{ |users| [users.association :company]}
end
Factory.define :user do |f|
f.companies{ |companies| [companies.association :user]}
end
agora eu tento
Factory :user
Talvez sem surpresa isso resulte em um loop infinito, pois as fábricas recursivamente se usam para se definir.
Surpreendentemente, não encontrei uma menção de como fazer isso em nenhum lugar; existe um padrão para definir as fábricas necessárias ou estou fazendo algo fundamentalmente errado?
O Factorygirl foi atualizado e agora inclui retornos de chamada para resolver esse problema. Dê uma olhada em http://robots.thoughtbot.com/post/254496652/aint-no-calla-back-girl para obter mais informações.
fonte
after(:create)
em vez deafter_create
em Factory Girl como mencionado aqui: stackoverflow.com/questions/15003968/...Na minha opinião, basta criar duas fábricas diferentes, como:
Quando você escreve os casos de teste para o usuário, basta escrever assim
Espero que funcione.
fonte
Não encontrei um exemplo para o caso mencionado acima no site fornecido. (Apenas 1: N e associações polimórficas, mas não habtm). Eu tive um caso semelhante e meu código fica assim:
fonte
O que funcionou para mim foi definir a associação ao usar a fábrica. Usando seu exemplo:
fonte
Achado desta maneira agradável e detalhado:
fonte
foos { |a| [a.association(:foo)] }
me ajuda muito! Obrigado!Aviso: Altere os usuários: [user] para: users => [user] para ruby 1.8.x
fonte
after_create { |company, evaluator| FactoryGirl.create_list(:user, evaluator.users_count, companies: [company]) }
:?Antes de tudo, recomendo que você use has_many: through em vez de habtm (mais sobre isso aqui ), para que você termine com algo como:
Depois disso, você terá muitas associações de ambos os lados e poderá atribuir a elas em factory_girl da maneira que você fez.
fonte
Employment belongs_to :user
eEmployment belongs_to :company
com o modelo de junção conectando uma empresa a um usuário?Atualização para o Rails 5:
Em vez de usar
has_and_belongs_to_many
associação, você deve considerar:has_many :through
associação.A fábrica do usuário para esta associação é assim:
Você pode criar a fábrica da empresa de maneira semelhante.
Depois que as duas fábricas estiverem definidas, você poderá criar uma
user_with_companies
fábricacompanies_count option
. Aqui você pode especificar a quantas empresas o usuário pertence:create(:user_with_companies, companies_count: 15)
Você pode encontrar explicações detalhadas sobre as associações de garotas de fábrica aqui .
fonte
Para o HABTM, usei características e retornos de chamada .
Digamos que você tenha os seguintes modelos:
Você pode definir a fábrica acima :
fonte
Você pode definir uma nova fábrica e usar o retorno de chamada após (: criar) para criar uma lista de associações. Vamos ver como fazer isso neste exemplo:
O atributo companies_count é temporário e está disponível em atributos da fábrica e no retorno de chamada por meio do avaliador. Agora, você pode criar um usuário com empresas com a opção de especificar quantas empresas você deseja:
fonte