2012-08-07 3 views
5

Ich habe einen Benutzer und Geschichte Modelle, die beide Kommentare haben.wie polymorphe Assoziation mit Fabrik Mädchen zu definieren

erklärte ich die folgenden Modelle wie folgt:

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

class User 
end 

class Story 
end 

Nun möchte ich einen Kommentar Objekt mit factory erklären, die als lobenswert und als Benutzer auf den gleichen Benutzer gehört.

Hier ist mein Code so weit:

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 

Das Problem hierbei ist, dass der Benutzer, der den Kommentar und die lobens Benutzer sind nicht das gleiche schreiben.

Warum sollte ich das beheben?

Viele TNX

+0

Sie können auch Lösungen auf diese Frage finden Sie hier: http: //Paketüberfluss.com/questions/7747945/factorygirl-und-polymorphe-associations/24228599 # 24228599 –

Antwort

5

Zunächst einmal, ich glaube nicht, bist du ganz Ihre Assoziationen fertig einrichten ... Ich denke, das ist, was Sie wollen:

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 

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

Vergessen Sie nicht das DB-Setup.

Zweitens gibt das Factory-Setup zwei Benutzer zurück, weil Sie es sagen. Versuchen Sie:

Als eine Frage des Stils ist die Wahl der Modellnamen hier ein wenig verwirrend. Wie ist ein Benutzer "kommentierbar"? Wenn Sie eine andere Art des Schreibens meinen, würde ich einen anderen Namen wählen. Dito, wenn Sie "Benutzerprofil" oder etwas in dieser Richtung meinen.

+0

Ok, aber der Punkt ist, wie ich ein Benutzerobjekt assoziieren, zwei zu Assoziation gehört? Ich möchte dem Benutzerattribut in der Kommentarklasse denselben lobenswerten Benutzer hinzufügen. – gilsilas

0

Ich bin auf diese Frage gestoßen, weil ich persönlich eine ähnliche hatte und gerade gelöst habe. Wie @jordanpg bin ich gespannt wie ein User kommentiert werden kann. Wenn ich richtig bin zu verstehen, ist das Problem, dass der Benutzer, der die Geschichte und den Benutzer geschrieben, die den Kommentar über die Geschichte schrieben verschiedene Benutzer sein könnte:

  • user_1 schreibt eine Geschichte
  • user_2 (oder jeder Benutzer) Kommentar kann

Damit auf user_1 Geschichte zu tun hatte ich Modell Verbände wie diese ein:

# 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 

Und dann in meiner Fabrik, würde es so aussehen :

# 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 

Teil, warum dies funktioniert, weil factory_bot automatisch die Eltern eines Kindes bauen Sie erstellen. Ihre Dokumente auf Vereinigungen sind ziemlich gut: http://www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md#Associations

Wenn Sie Benutzer müssen in der Lage sein, auf Kommentare zu kommentieren, können Sie es wie dies tun könnte:

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