我在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表有多个连接,一个是提交它的人,其余的是被指定处理它的用户。
答案 0 :(得分:2)
两者都有效;但是,就个人而言,我更喜欢has_many:通过关系。原因是您可以访问连接表。为此,请生成名为ticket_user
的模型,其中包含名为user_id
和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
有关详细信息,请查看此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