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

How do I associate two entries in a database that are connected through a many-to-many relationship in Rails?

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

我正在尝试将问题跟踪器的用户和问题相关联。我使用的是 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 方法。

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

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

User.find(id).issues

如果要向关联添加记录,可以使用 shovel 方法或任何方法 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 并且想要显式配置 table 和外键名字。

如果你真的想使用has_and_belongs_to_many,我也很怀疑。仅当您无法预见需要向联接 table 添加其他属性或永远不需要直接查询 table 时,才应真正使用它 - 这似乎很不现实在问题跟踪器中为真。你想要 has_many through: - pretty much always.

I have a route post "/", to: "home#create". I'm trying to make a create method in home_controller.rb.

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

也许我需要做的就是将您引导至 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( ... )