我有一个User,Post和Like模型。用户有很多帖子,用户可以喜欢帖子。
has_many :user_posts
has_many :users, through: :user_posts
has_many :likes
has_many :users, through: :likes
另一方面,我的rspec是:
it { should have_many(:users).through(:user_posts) }
it { should have_many(:user_posts) }
it { should have_many(:likes) }
it { should have_many(:user_likes).through(:likes) }
这似乎并没有很好,因为rspec抱怨通过用户已经存在关系:
Expected Post to have a has_many association called users (, Expected users to have users through likes, but got it through user_posts)
我尝试了与class_name的所有组合,但没有取得多大成功。我该如何定义这些关系?
答案 0 :(得分:0)
我根据上面的代码做了一些推论。让我解释一下我做出的选择......
您的术语围绕"用户帖子"对我来说是模棱两可的,因为它不清楚用户是否发布"用户喜欢或用户创作的内容。
在我的代码中,has_many :posts
指的是 authorship ,并且不要求连接表,因为帖子只有一个作者。另一方面,has_many :liked_posts
需要through:
联接表(喜欢),因为它是多对多的关系。
我唯一不同的做法是在关联中使用source:
选项。由于Like不知道liked_posts
或users_who_liked
是什么,因此您需要告诉它要跟踪哪些拥有关联才能获取记录。< / p>
class User < ActiveRecord:Base
has_many :posts
has_many :likes
has_many :liked_posts, through: :likes, source: :post
end
class Like < ActiveRecord:Base
belongs_to :user
belongs_to: post
end
class Post < ActiveRecord:Base
has_many :likes
has_many :users_who_liked, through: likes, source: :user
end
最后,正如你所写的问题的反馈:汤姆在上面的评论中是正确的。目前尚不清楚这些协会属于哪些类别。用户是否有两次用户?混乱。如果我错误地推断了您的任何业务规则,请告诉我,我可以修改我的想法。