如何定义与工厂女孩的多态关联

时间:2012-08-07 16:03:56

标签: ruby-on-rails-3 factory-bot

我有一个用户和故事模型,他们都有评论。

我宣布了以下模型如下:

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

2 个答案:

答案 0 :(得分: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

作为一种风格问题,模型名称的选择在这里有点令人困惑。用户如何“可评论”?如果你的意思是其他类型的写作,我会选择一个不同的名字。同上,如果你的意思是“用户档案”或类似的东西。

答案 1 :(得分: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