同一张表的多个关联(多对多)Ruby on Rails

Posted

技术标签:

【中文标题】同一张表的多个关联(多对多)Ruby on Rails【英文标题】:Multiple Associations With the Same Table (Many-to-Many) Ruby on Rails 【发布时间】:2016-11-30 16:41:22 【问题描述】:

我正在尝试找出完成一段关系的最佳方式,但遇到了一些麻烦。我遇到了几篇文章,这些文章在一定程度上解决了我想要做的事情,但不完全是。

我有一个用户模型和一个门票模型。两者都是通过 UserTickets 模型加入的,因此我可以将多个用户分配给一张票。我想做的是将分配给票证的用户划分为请求者和代理。如果用户是请求者或代理,Users 模型没有任何列要声明,而是我有 is_admin、is_customer 等。我认为我需要的是 Ruby On Rails - many to many between the same table 但不完全是。

理想情况下,我希望我的门票表采用 agent_id(来自 User 类的 user_id)和 requester_id(来自 User 类的 user_id),而不是一般的 user_id(来自 User 类的 user_id,它将所有用户组合成一个组)。我认为仍然允许我调用 @current_user.tickets 来提取分配给该用户的所有票证。

这是我的用户模型:

  has_many :user_tickets
  has_many :support_tickets, through: :user_tickets

这是我的门票模型:

  has_many :user_tickets
  has_many :users, through: :user_tickets

这是我的 UserTickets 加入模型:

  belongs_to :user
  belongs_to :support_ticket

非常感谢您的帮助!

这不是重复的。

【问题讨论】:

Optional many to many relationship in rails?的可能重复 【参考方案1】:

@Skylar,

1) 如果您的目标是将多个用户分配给一个工单?因为这不需要多对多关系。您只需要在用户模型上建立一对多关系和布尔属性agent?。如果您更喜欢这个,您甚至可以创建使用 User 模型的代理模型。

2) 但是,如果您想创建多对多关系,请查看 this。 Rails 文档比我写的要好。请参阅第 2.6 节 has_and_belongs_to_many 关联。

解决方案 1)

型号

class User < ApplicationRecord
  has_many :tickets, class_name: :Ticket, foreign_key: :agent_id

  def agent?
    self.agent
  end
end

class Agent < User
  default_scope  where(agent: true) 
end

class Ticket < ApplicationRecord
  belongs_to :user
  belongs_to :agent, class_name: :User
end

迁移

class CreateTickets < ActiveRecord::Migration[5.0]
  def change
    create_table :tickets do |t|
      t.references :user, index: true
      t.references :agent, index: true
      t.string :event_name
      t.timestamps
    end
  end
end

【讨论】:

Dan,在查看了您发送过来的链接中的 2.6 并使用该图作为示例之后.. 我想要组件上的两组零件...例如金属零件或木制零件从零件模型中的 part_id 中提取。关于零件是木制还是金属的声明将由将其输入组件的用户决定,因为零件表中没有可识别的列来描述它是什么类型。 它回答了你的问题吗? 恐怕不是。我不知道如何设置模型来说明我想要做什么。 您只需要一个 Ticket 模型、一个 User 模型和一个 Agent 模型,如上所述。您的票证迁移需要有两个参考;一个用于用户,另一个用于代理。这样,您可以使用代理创建票证,然后添加用户(买方),每张售出的票证将有两个参考。您可以在用户模型中控制它和/或您可以创建 PORO 作为服务对象来处理它。 另一种解决方案是创建一个连接表Ticketing,它将连接ticket_id、user_id 和agent_id。它会有自己的 id 并且不要忘记时间戳。您需要手动创建此迁移并拥有上述 3 个模型。

以上是关于同一张表的多个关联(多对多)Ruby on Rails的主要内容,如果未能解决你的问题,请参考以下文章

多对多表的设计小案例

与同一张表的关系(多对多?) - Laravel

Laravel 定义同一张表的多对多关系

mybatis11--多对多关联查询

ON CASCADE DELETE 对同一张表之间的多对多关系

数据库设计中,多对多关系使用使用逗号分割关联讨论