Rails 3.2中连接表的正确结构

时间:2012-09-05 14:09:21

标签: ruby-on-rails

我在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

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

目前在PHP中设置的方式只是使用一个将userID与ticketID匹配的连接表。我不认为除了那之外我还不需要任何关于这种关系的其他数据,那么has_and_belongs_to_many是最好的选择吗?

此外,这是否会导致问题,因为故障单已经与用户表(原始创建者)中的记录相关联?基本上,票证将与users表有多个连接,一个是提交它的人,其余的是被指定处理它的用户。

3 个答案:

答案 0 :(得分:2)

两者都有效;但是,就个人而言,我更喜欢has_many:通过关系。原因是您可以访问连接表。为此,请生成名为ticket_user的模型,其中包含名为user_idticket_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

有关详细信息,请查看此guide

答案 1 :(得分:0)

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

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

您必须创建一个包含ticket_id和member_id的表members_users作为字段,如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

答案 2 :(得分:0)

这可能有效 - 在用户和票证之间创建两个关系,票证belongs_to creator,:class_name用户和票证has_many assigned_users,class_name用户和用户模型has_many created_tickets和has_many assigned_tickets