0

我正在重写 Rails 中基于 PHP 的支持票证系统,但遇到了障碍。我创建了用户表并创建了票证表

create_table "tickets", :force => true do |t|
  t.integer  "user_id",       :null => false
  t.integer  "department_id", :null => false
  t.integer  "upload_id",     :null => false
  t.string   "subject",       :null => false
  t.text     "body",          :null => false
  t.string   "status_id",     :null => false
  t.text     "url",           :null => false
  t.datetime "created_at",    :null => false
  t.datetime "updated_at",    :null => false
end

create_table "users", :force => true do |t|
  t.string   "fName",      :null => false
  t.string   "lName",      :null => false
  t.string   "seKey",      :null => false
  t.boolean  "isAdmin"
  t.datetime "created_at", :null => false
  t.datetime "updated_at", :null => false
  t.string   "auth_token"
end

一切都很好,我可以创建票证等...现在我需要为票证分配 1 个或多个管理员,但不确定我应该使用 has_and_belongs_to_many 关系还是 has_many :through 关系。

目前在 PHP 中设置的方式只是使用一个将用户 ID 与票证 ID 匹配的连接表。我认为我不需要任何其他与这种关系相关的数据,所以 has_and_belongs_to_many 是最好的选择吗?

此外,由于工单已经与用户表(原始创建者)中的记录相关联,这是否会导致问题?基本上一张票将与用户表有多个连接,一个是提交它的人,其余的是被分配处理它的用户。

4

3 回答 3

2

两者都有效;但是,就我个人而言,我更喜欢 has_many :through 关系。原因是您可以访问连接表。为此,请生成一个ticket_user名为user_idand的模型ticket_id。然后在模型中添加

belongs_to :user
belongs_to :ticket

然后你可以添加到票模型

has_many :ticket_users
has_many :users :through ticket_user

这给用户模型

has_many :ticket_users
has_many :ticket :through ticket_user

然后检索所有用户票

user.tickets

获得所有门票用户做

ticket.users

有关更多信息,请查看本指南

于 2012-09-05T15:59:19.440 回答
0

在你的情况下 has_and_belongs_to_many 是额外的关系。

has_and_belongs_to_many :members, :class_name => "User", :join_table => "members_tickets"

您可能必须创建一个表 members_users,其中包含 ticket_id 和 member_id 作为字段,如http://guides.rubyonrails.org/association_basics.html#choosing-between-has_many-through-and-has_and_belongs_to_many中所示

现在您可以获得如下分配成员的列表

@ticket.members # list of members
@ticket.members << @user # add new member
于 2012-09-05T14:21:05.640 回答
0

这可能有效 - 在用户和工单之间创建两个关系,工单belongs_to creator,:class_name用户和工单has_manyassigned_users,class_name用户和用户模型has_many created_tickets和has_manyassigned_tickets

于 2012-09-05T14:30:26.357 回答