2012-08-07 69 views
5

我有一個用戶和故事模型,他們都有評論。如何定義工廠女孩的多態關聯

我聲明瞭以下型號如下:

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

class User 
end 

class Story 
end 

現在,我要聲明與FactoryGirl評論對象屬於值得稱讚和用戶相同的用戶。

這是到目前爲止我的代碼:

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 

這裏的問題是,寫註釋和值得稱道的用戶的用戶是不一樣的。

我爲什麼要解決這個問題?

許多TNX

+0

你也可以在這裏找到這個問題的解決方案:HTTP: //堆棧溢出。com/questions/7747945/factorygirl-and-polymorphic-associations/24228599#24228599 – 2014-06-15 10:18:46

回答

5

首先,我不認爲你完全完成設置你的組織...我認爲這是你想要的東西:

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 

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

不要忘記數據庫設置。

其次,Factory Setup正在返回兩個用戶,因爲您正在告訴它。嘗試:

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 

作爲一個風格的問題,模型名稱的選擇有點混淆在這裏。用戶如何評論?如果你的意思是其他類型的寫作,我會選擇一個不同的名字。同上,如果你的意思是「用戶檔案」或沿着這些線路。

+0

好吧,但重點是,我如何將一個用戶對象與兩個關聯屬於關聯?我想在評論類中爲用戶屬性添加相同的可用用戶。 – gilsilas 2012-08-08 07:37:03

0

我遇到過這個問題,因爲我個人有類似的問題,只是解決了它。像@jordanpg一樣,我很好奇用戶如何評論。如果我理解正確,問題是,是誰寫的是誰寫的故事評論這個故事和用戶,用戶可以在不同的用戶:

  • USER_1寫了一個故事
  • user_2(或任何用戶)可以USER_1的故事

爲了做到這一點評論,我會建立模型協會這樣的:

# 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 

然後在我的工廠,它是這樣的:

# 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 

作品部分原因是因爲factory_bot會自動構建您正在創建的任何小孩的父項。他們對協會的文檔都還不錯:http://www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md#Associations

如果您需要用戶能夠對評論發表評論,你可以做這樣的:

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