rails has_many通过相同的目的地

时间:2015-09-22 20:58:31

标签: ruby-on-rails activerecord rspec

我有一个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的所有组合,但没有取得多大成功。我该如何定义这些关系?

1 个答案:

答案 0 :(得分:0)

我根据上面的代码做了一些推论。让我解释一下我做出的选择......

您的术语围绕"用户帖子"对我来说是模棱两可的,因为它不清楚用户是否发布"用户喜欢或用户创作的内容。

在我的代码中,has_many :posts指的是 authorship ,并且不要求连接表,因为帖子只有一个作者。另一方面,has_many :liked_posts需要through:联接表(喜欢),因为它是多对多的关系。

我唯一不同的做法是在关联中使用source:选项。由于Like不知道liked_postsusers_who_liked是什么,因此您需要告诉它要跟踪哪些拥有关联才能获取记录。< / p>

您可以在Rails API Documentation

中详细了解关联
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

最后,正如你所写的问题的反馈:汤姆在上面的评论中是正确的。目前尚不清楚这些协会属于哪些类别。用户是否有两次用户?混乱。如果我错误地推断了您的任何业务规则,请告诉我,我可以修改我的想法。