使用相同表(多对多)Ruby on Rails的多个关联

时间:2016-11-30 16:41:22

标签: ruby-on-rails activerecord associations rails-activerecord relationship

我正在努力找出完成关系和遇到麻烦的最好方法。我遇到过一些文章,这些文章有点解决了我想要做的事情,但并不完全。

我有一个用户模型和一个Tickets模型。两者都通过UserTickets模型连接,因此我可以将多个用户分配给故障单。我想要做的是将分配给故障单的用户分段为请求者和代理。如果用户是请求者或代理,则Users模型没有任何要声明的列,而是我有is_admin,is_customer等。我认为我需要的是Ruby On Rails - many to many between the same table,但并不完全。

理想情况下,我想让我的Tickets表获取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

非常感谢您的帮助!

这不重复。

1 个答案:

答案 0 :(得分:0)

@Skylar,

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

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