2012-08-07 9 views
5

Tengo un usuario y modelos de historias que tienen comentarios.cómo definir la asociación polimórfica con factory girl

que declararon los siguientes modelos de la siguiente manera:

class Comment 
    belongs_to :commentable, polymorphic: true 
    belongs_to :user 
end 

class User 
end 

class Story 
end 

Ahora, quiero declarar un objeto de comentario con factorygirl que pertenece al mismo usuario como encomiable y como usuario.

Aquí está mi código hasta ahora:

FactoryGirl.define do 
    factory :user do 
    sequence(:email) {|n| "person#{n}@exmaple.com"} 
    sequence(:slug) {|n| "person#{n}"} 
    end 

    factory :comment do  
    occured_at { 5.hours.ago } 
    user 
    association :commentable, factory: :user 
    end 

end 

El problema aquí es que el usuario que escribir el comentario y el usuario encomiable no son lo mismo.

¿Por qué debería arreglar eso?

Muchos TNX

+0

También puede encontrar soluciones a esta pregunta aquí: http: //desbordamiento de pila.com/questions/7747945/factorygirl-and-polymorphic-associations/24228599 # 24228599 –

Respuesta

5

En primer lugar, no creo que estés bastante terminado de configurar sus asociaciones ... Creo que esto es lo que quiere:

class Comment < AR 
    belongs_to :commentable, polymorphic: true 
end 

class User < AR 
    has_many :comments, as: :commentable 
end 

class Story < AR 
    has_many :comments, as: :commentable 
end 

Ver: http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

No olvide la configuración de la base de datos.

En segundo lugar, la configuración de fábrica devuelve dos usuarios porque se lo está diciendo. Pruebe:

FactoryGirl.define do 
    factory :user do 
    sequence(:email) {|n| "person#{n}@exmaple.com"} 
    sequence(:slug) {|n| "person#{n}"} 
    end 

    factory :comment do  
    occured_at { 5.hours.ago } 
    association :commentable, factory: :user 
    end 

end 

Como una cuestión de estilo, la elección de los nombres de los modelos es un poco confusa aquí. ¿Cómo es un usuario "commentable"? Si te refieres a otro tipo de escritura, elegiría un nombre diferente. Lo mismo si se refiere a "perfil de usuario" o algo similar.

+0

Ok, pero el punto es, ¿cómo asocio un objeto de usuario a dos pertenece a la asociación? Quiero agregar el mismo usuario encomiable al atributo de usuario en la clase de comentarios. – gilsilas

0

Me encontré con esta pregunta porque personalmente tuve una similar y la resolví. Al igual que @jordanpg, tengo curiosidad sobre cómo un usuario es comentable. Si estoy entendiendo correctamente, el problema es que el usuario que escribió la historia y el usuario que escribió el comentario sobre la historia podría ser usuarios diferentes:

  • usuario_1 escribe una historia
  • usuario _2 (o cualquier usuario) puedo comentar sobre la historia de usuario_1

con el fin de hacer eso, me había instalado asociaciones modelo así:

# app/models/user.rb 
class User < ApplicationRecord 
    has_many :stories 
    has_many :comments 
end 

# app/models/story.rb 
class Story < ApplicationRecord 
    belongs_to :user 
    has_many :comments, as: :commentable 
end 

# app/models/comment.rb 
class Comment < ApplicationRecord 
    belongs_to :user 
    belongs_to :commentable, polymorphic: true 
end 

Y luego, en mi fábrica, se vería como este :

# spec/factories.rb 
FactoryBot.define do 

    factory :user do 
    sequence(:email) {|n| "person#{n}@exmaple.com"} 
    sequence(:slug) {|n| "person#{n}"} 
    end 

    factory :post do 
    body "this is the post body" 
    user 
    end 

    factory :comment do 
    body "this is a comment on a post" 
    user 
    association :commentable, factory: :post 
    end 
end 

Parte de por qué esto funciona es porque factory_bot generará automáticamente el padre de un niño que está creando. Sus documentos de asociaciones son bastante buenas: http://www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md#Associations

Si necesita que los usuarios podrán hacer comentarios sobre los comentarios, usted podría hacerlo de esta manera:

factory :comment_on_post, class: Comment do 
    body "this is a comment on a post" 
    user 
    association :commentable, factory: :post 
    end 

    factory :comment_on_comment, class: Comment do 
    body "this is a comment on a comment" 
    user 
    association :commentable, factory: :comment_on_post 
    end 
Cuestiones relacionadas