如何关联数据库中通过 Rails 中的多对多关系连接的两个条目?

Posted

技术标签:

【中文标题】如何关联数据库中通过 Rails 中的多对多关系连接的两个条目?【英文标题】:How do I associate two entries in a database that are connected through a many-to-many relationship in Rails? 【发布时间】:2021-09-05 07:12:12 【问题描述】:

我正在尝试为问题跟踪器关联用户和问题。我使用的是has_and_belongs_to_many,而不是:through。我有一个:user_id:issue_id 可供我使用,但似乎没有User.issues.find(id)Issue.users.find(id) 可供我使用。我有一条路线post "/", to: "home#create"。我正在尝试在 home_controller.rb 中创建 create 方法。

【问题讨论】:

【参考方案1】:

从外观上看,您调用的是 User 类上的方法,而不是实例。

如果您想将问题与用户联系起来,您需要先获取用户:

User.find(id).issues

如果要向关联中添加记录,可以使用铲子方法或任何方法generated by the association macro:

User.find(id).issues << Issue.find(3)
User.find(id).issues.push(Issue.find(3))
User.find(id).issue_ids = [1, 2, 3]

此外,您的架构中还有一些命名问题。在您的数据库架构中使用snake_case everywhere,除非您有充分的理由要打破the conventions 并想显式配置表和外键名称。

如果你真的想使用has_and_belongs_to_many,我也很想问。仅当您无法预见您将需要向连接表添加其他属性或从不需要直接查询表时才应该真正使用它 - 在问题跟踪器中这似乎是不切实际的。你想要has_many through: - pretty much always。

我有一个路由帖子“/”,到:“home#create”。我正在尝试制作一个 在 home_controller.rb 中创建方法。

不要把所有东西都扔进垃圾抽屉控制器。从可以被 CRUD:ed 处理的资源的角度考虑您的应用,并创建控制器来处理仅处理该资源。您应该考虑在您的域中用户和问题之间的关系是什么,以及如何将其建模为域逻辑中的实际实体,而不仅仅是管道。

【讨论】:

【参考方案2】:

也许我需要做的就是将您引导至Rails Guides: Active Record Associations。

这两个都没有

User.issues.find(id)
Issue.users.find(id)

因为当您通过 id 查找问题或用户时,您不使用关联。而是使用这些:

Issues.find(id)
Users.find(id)

由于:id 是独一无二的,所以它可以工作并且应该是您想要的。

您想使用关联查询问题或用户的唯一时间是您拥有关系另一端的数据。

user = User.find(user_id)
issue = user.issues.where(id: issue_id)

由于:id 字段是唯一的,因此它与Issues.find(id) 相同。但是,如果您想获取用户对其他数据的问题的集合,您可以将该数据的条件放在 where 中。

您可以通过这种方式为用户创建问题:

user = User.find(user_id)
issue = User.issues.create( ... )

【讨论】:

以上是关于如何关联数据库中通过 Rails 中的多对多关系连接的两个条目?的主要内容,如果未能解决你的问题,请参考以下文章

如何将现有的一对多关系迁移到 Rails 和 ActiveRecord 中的多对多

如何从雄辩关系中的第三个表中获取数据雄辩的多对多关系

Hibernate-ORM:12.Hibernate中的多对多关联关系

TP中的模型关联的多对多关系

Hibernate的多对多关联关系

如何在 Ruby on Rails 中管理嵌套字段的多对多关系