ruby-on-rails - has_many - rails references
Cómo hacer has_many: a través de la asociación con los accesorios? (3)
No puedo usar factory_girl
porque estoy probando sunspot y necesito una base de datos real.
Editar : no. Puede funcionar con manchas solares. Me equivoco.
¿Cómo puedo construir has_many: a través de (también conocido como many-to-many) asociaciones en accesorios?
Lo googleo y obtengo una solución inválida
Editar :
Finalmente uso factory_girl. Yo google-copy-paste un fragmento:
factory :tagging do
question { |a| a.association(:question) }
tag { |a| a.association(:tag) }
end
(la pregunta tiene muchas etiquetas a través de etiquetas, viceversa)
Funciona bien. Pero, ¿qué es eso? El archivo Léame de factory_girl no significaba esta sintaxis. ¿Alguien podría explicar?
Si se trata de un clásico de la asociación has_and_belongs_to_many, sin otra información en el modelo de asociación, creo que las convenciones le permiten escribir sus dispositivos de esa manera:
#users.yml
john:
first_name: John
last_name: Doe
hobbies: [swim, play_tennis]
#hobbies.yml
swim:
name: Swim
play_tennis:
name: Play Tennis
¡Pero no estoy completamente seguro!
Puede encontrar la documentación oficial para factory_girl, que es muy completa, aquí .
Aquí hay un blogpost bueno (más corto) que explica factory_girl 2 (comparándolo con factory-girl 1).
ACTUALIZADO:
Para explicar el código un poco:
factory :tagging do
association :tag
end
buscará una fábrica llamada :tag
y construirá ese objeto, y luego lo vinculará a la tag
asociación (por ejemplo, un belongs_to
) que está dentro de su objeto :tagging
.
Tenga en cuenta: esta es la fábrica predeterminada. Si quieres taggings
para compartir una tag
, deberás hacer algo como
@tag = Factory(:tag)
@tagging_1 = Factory(:tagging, :tag => @tag)
@tagging_2 = Factory(:tagging, :tag => @tag)
Espero que esto ayude.
Utilicé accesorios en pruebas para has_many :through
de hash merge
# posts.yml
one:
title: "Railscasts"
url: "http://railscasts.com/"
description: "Ruby on Rails screencasts"
# categories.yml
one:
name: "magazine"
two:
name: "tutorial"
three:
name: "news"
four:
name: "Ruby"
# posts_controller_test.rb
def test_post_create
assert_difference ''Post.count'' do
post :create, post: posts(:one).attributes
.merge(categories: [categories(:two), categories(:four)])
end
end
cuando después de agregar otro archivo de dispositivo, e intenté esto, no funcionó
# post_categories.yml
one:
post: one
category: two
two:
post: one
category: four
def test_post_create
assert_difference ''Post.count'' do
post :create, post: posts(:one)
end
end
puts posts(:one).attributes
# {"id"=>980190962, "url"=>"http://railscasts.com/", "title"=>"Railscasts", "description"=>"Ruby on Rails screencasts", "created_at"=>Thu, 14 May 2015 18:27:20 UTC +00:00, "updated_at"=>Thu, 14 May 2015 18:27:20 UTC +00:00}
puts posts(:one).attributes
.merge(categories: [categories(:two), categories(:four)])
# {"id"=>980190962, "url"=>"http://railscasts.com/", "title"=>"Railscasts", "description"=>"Ruby on Rails screencasts", "created_at"=>Thu, 14 May 2015 18:30:23 UTC +00:00, "updated_at"=>Thu, 14 May 2015 18:30:23 UTC +00:00, "category_ids"=>[980190962, 1018350795]}