【问题标题】:rails has_many through same destinationrails has_man 通过同一个目的地
【发布时间】:2015-09-22 20:58:31
【问题描述】:

我有一个 User、Post 和 Like 模型。一个用户有很多帖子,一个用户可以点赞帖子。

  has_many :user_posts
  has_many :users, through: :user_posts
  has_many :likes
  has_many :users, through: :likes

另一方面,我的 rspecs 是:

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

【问题讨论】:

  • 用户不应该只是 has_many :posts。为什么是 user_posts?
  • 您的问题/示例代码不是很清楚 - 所有这些关系都在同一个模型上吗?您的每个 RSpec 期望与哪些模型相关?您的期望之一提到:user_likes 但这不在您最初陈述的关系中。
  • @LannyBose,你是对的。最初我认为我可以处理用户和帖子之间的一种关系:用户有帖子并且用户喜欢帖子。但这显然行不通,因此我正在寻找喜欢的模型。这确实意味着我可以删除多对多关系以支持 has_many

标签: ruby-on-rails activerecord rspec


【解决方案1】:

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

您关于“用户帖子”的术语对我来说是模棱两可的,因为不清楚“用户帖子”是用户喜欢还是用户创作

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

唯一不同的是我在关联中使用了source: 选项。由于 Like 不知道 liked_postsusers_who_liked 是什么,您需要告诉它要遵循哪个自己的关联来获取记录。

您可以在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

最后,作为对您所写问题的反馈:汤姆在上面的评论中是对的。目前尚不清楚这些关联属于哪些类别。一个用户有两次用户吗?令人困惑。如果我错误地推断出您的任何业务规则,请告诉我,我可以修改我的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    相关资源
    最近更新 更多