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
首先,我认为你没有完成你的协会......我认为这就是你想要的:
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)
作为一种风格问题,模型名称的选择在这里有点令人困惑.用户如何"可评论"?如果你的意思是其他类型的写作,我会选择一个不同的名字.同上,如果你的意思是"用户个人资料"或类似的东西.
我遇到了这个问题,因为我个人有一个类似的问题并且刚刚解决了它。和@jordanpg 一样,我很好奇用户是如何评论的。如果我理解正确,问题是写故事的用户和写故事评论的用户可能是不同的用户:
为了做到这一点,我会像这样设置模型关联:
# 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)