references rails has_many has_and_belongs_to_many foreign belong accepts_nested_attributes_for ruby-on-rails rspec factory-bot fixtures

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]}