2012-08-07 71 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