Factory_bot: Documentação para criar associações has_many

Criado em 19 set. 2011  ·  5Comentários  ·  Fonte: thoughtbot/factory_bot

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!

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.

Todos 5 comentários

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!

Esta página foi útil?
0 / 5 - 0 avaliações