Lamento ter que voltar para a lista de problemas aqui, mas não consigo encontrar nenhuma documentação sobre a criação de has_many
relacionamentos no FG 2.0. Depois de algumas experiências, encontrei a solução abaixo, mas não sei se essa é a maneira "certa" de fazer isso:
class Post < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :post
end
FactoryGirl.define do
factory :comment do
body 'This is a comment'
end
factory :post do
title 'This is a Post'
comments { FactoryGirl.create_list(:comment, 2) }
# or, to create only one => comments { [FactoryGirl.create(:comment)] }
end
end
Factory.create :post
Um problema é que não saberei se você chamou build
ou create
quando fatorou (legal, certo?) Sua postagem, mas isso sempre criará os comentários. Então, brinquei um pouco com a sintaxe para colocar association
lá e descobri o seguinte:
factory :post do
title 'This is a Post'
comments { [association(:comment)] }
end
Essa é a maneira certa de fazer isso? GETTING_STARTED
tem uma ótima referência para quase tudo que você pode fazer com FG, exceto este caso. Obrigado!
A propósito, se esse método posterior for o correto, ficaria feliz em atualizar os documentos sozinho e emitir uma solicitação de pull.
+1 algo assim é necessário
Criar registros para uma associação has_many
é meio complicado, por alguns motivos:
Primeiro, sempre há um problema da galinha e do ovo ao fazer isso em um banco de dados relacional, porque um registro tem que existir antes do outro. Você não pode criar registros em tabelas separadas simultaneamente, e uma tabela deve conter a chave primária da outra.
Em segundo lugar, não há como saber que tipo de validações ou callbacks estão em vigor nos modelos em questão, então é difícil saber se a coleção precisa ser salva ou não.
Se você está validando que pelo menos um membro está presente na coleção, você pode tentar passar uma lista de registros não salvos (usando Factory.build
).
Se você não está validando nada sobre a coleção, recomendo fazer isso em um retorno de chamada after_create.
Depois de falar sobre isso com @jferris , parece que a sintaxe ideal pode ser algo assim:
FactoryGirl.define do
factory :user, :aliases => [:author]
factory :comment do
author
post
factory :old_comment do
created_at { 1.year.ago }
end
end
factory :post do
factory :commented_post do
comments(2) # this would create two `:comment`s
# alternatively...
comments # this would create one `:comment`
old_comments(2, :body => 'something static') # this would create two `:comment`s, both with body of 'something static'
old_comments # this would create one `:old_comment`
end
end
end
Eu adicionei mais documentação neste commit: https://github.com/thoughtbot/factory_girl/commit/9c6c252d0fb58ba6321d8db56778bb3469ff5a77
Inclui testes (uma vez que são uma ótima forma de documentação), mas o exemplo principal está no documento GETTING_STARTED.
Embora seja benéfico discutir melhorias sintáticas e maneiras de tornar isso mais direto, acho que é melhor lidar com uma solicitação pull separada quando uma implementação é iniciada; por enquanto, isso se concentra na documentação e esse commit deve lidar com essa solicitação.
Obrigado a todos por sua contribuição para a discussão!
Comentários muito úteis
Criar registros para uma associação
has_many
é meio complicado, por alguns motivos:Primeiro, sempre há um problema da galinha e do ovo ao fazer isso em um banco de dados relacional, porque um registro tem que existir antes do outro. Você não pode criar registros em tabelas separadas simultaneamente, e uma tabela deve conter a chave primária da outra.
Em segundo lugar, não há como saber que tipo de validações ou callbacks estão em vigor nos modelos em questão, então é difícil saber se a coleção precisa ser salva ou não.
Se você está validando que pelo menos um membro está presente na coleção, você pode tentar passar uma lista de registros não salvos (usando
Factory.build
).Se você não está validando nada sobre a coleção, recomendo fazer isso em um retorno de chamada after_create.