我有一个用户和故事模型,他们都有评论。
我宣布了以下模型如下:
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 :(得分: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一样,我很好奇用户是如何评论的。如果我理解正确,问题在于撰写故事的用户和撰写故事评论的用户可能是不同的用户:
为此,我设置了这样的模型关联:
# 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