2012-08-07 5 views
5

Mam model użytkownika i historię, które obaj mają komentarze.jak zdefiniować powiązanie polimorficzne z dziewczyną z fabryki

oświadczyłem następujące modele jak poniżej:

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

class User 
end 

class Story 
end 

Teraz chcę zadeklarować obiekt komentarz z FactoryGirl który należy do tego samego użytkownika, jak pochwały i jako użytkownik.

Oto mój kod do tej pory:

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 

Problem polega na tym, że użytkownik, który napisać komentarz oraz pochwały użytkownika nie są takie same.

Dlaczego powinienem to naprawić?

Wiele TNX

+0

Można również znaleźć rozwiązania tej kwestii tutaj: http: //przepełnienie stosu.com/questions/7747945/factorygirl-and-polymorphic-association/24228599 # 24228599 –

Odpowiedz

5

Przede wszystkim nie sądzę, jesteś całkiem zakończeniu konfiguracji skojarzeń ... myślę, że to jest to, co chcesz:

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 

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

Nie zapomnij o konfiguracji DB.

Po drugie, konfiguracja fabryczna zwraca dwóch użytkowników, ponieważ mówisz o tym. Wypróbuj:

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 

Co do stylu, wybór nazw modeli jest nieco mylący. W jaki sposób użytkownik jest "komentowalny"? Jeśli masz na myśli inny rodzaj pisania, wybrałbym inną nazwę. To samo dotyczy "profilu użytkownika" lub czegoś podobnego.

+0

Ok, ale chodzi o to, jak przyporządkować jeden obiekt użytkownika do dwóch, który należy do skojarzenia? Chcę dodać tego samego godnego polecenia użytkownika do atrybutu użytkownika w klasie komentarzy. – gilsilas

0

Natknąłem się na to pytanie, ponieważ osobiście miałem podobny problem i właśnie go rozwiązałem. Podobnie jak @jordanpg, jestem ciekawy jak użytkownik jest komentowany. Jeśli jestem zrozumienia poprawnie, problem jest to, że użytkownik, który napisał historię i użytkownika, który napisał komentarz na historii może być różni użytkownicy:

  • użytkownika USER_1 pisze historię
  • user_2 (lub dowolnego użytkownika) może wypowiedzieć się na temat użytkownika USER_1 historii

aby to zrobić, ja skonfigurować modelu skojarzenia tak:

# 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 

a potem w moim zakładzie, będzie to wyglądać tak :

# 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 

Część dlaczego to działa dlatego factory_bot automatycznie budować rodzica każdego dziecka ty tworzysz. Ich Docs na stowarzyszenia są całkiem dobre: ​​http://www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md#Associations

Jeśli potrzebujesz użytkowników, aby móc komentować uwag, można zrobić to tak:

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