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

gil*_*las 6 ruby-on-rails-3 factory-bot

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

我宣布以下模型如下:

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

class User
end

class Story
end
Run Code Online (Sandbox Code Playgroud)

现在,我想声明一个具有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
Run Code Online (Sandbox Code Playgroud)

这里的问题是编写评论的用户和值得称道的用户不一样.

我为什么要解决这个问题?

很多TNX

jor*_*npg 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
Run Code Online (Sandbox Code Playgroud)

请参阅: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
Run Code Online (Sandbox Code Playgroud)

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


ric*_*nae 5

我遇到了这个问题,因为我个人有一个类似的问题并且刚刚解决了它。和@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
Run Code Online (Sandbox Code Playgroud)

然后在我的工厂中,它看起来像这样:

# spec/factories.rb
FactoryBot.define do

  factory :user do
    sequence(:email) {|n| "person#{n}@example.com"}
    sequence(:slug) {|n| "person#{n}"}
  end

  factory :story do
    body "this is the story body"
    user
  end

  factory :comment do
    body "this is a comment on a story"
    user
    association :commentable, factory: :story
  end
end
Run Code Online (Sandbox Code Playgroud)

这样做的部分原因是因为factory_bot它将自动构建您正在创建的任何子项的父项。他们关于关联的文档非常好:http : //www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md#Associations

如果您需要用户能够对评论发表评论,您可以这样做:

  factory :comment_on_story, class: Comment do
    body "this is a comment on a story"
    user
    association :commentable, factory: :story
  end

  factory :comment_on_comment, class: Comment do
    body "this is a comment on a comment"
    user
    association :commentable, factory: :comment_on_story
  end
Run Code Online (Sandbox Code Playgroud)