2012-09-05 47 views
0

我在Rails中重寫了一個基於PHP的支持票據系統,並遇到了麻煩。 我有我的用戶表中創建和我的票表創建Rails 3.2中連接表的正確結構

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中設置的方式是使用一個連接表,該連接表將userID與ticketID進行匹配。我認爲我不需要任何其他關於此關係的數據,那麼has_and_belongs_to_many是最好的選擇嗎?

另外,這是否會導致問題,因爲故障單已經與用戶表(原始創建者)中的記錄相關聯?基本上,票證將與用戶表有多個連接,其中一個將是提交它的人,其餘的是分配處理它的用戶。

+0

在學習Rails的協會,這個[指南](http://guides.rubyonrails.org/association_basics.html)幫了我很多,請查看 – MalSu

回答

2

雙方工作;但是,我個人更喜歡has_many:through關係。原因是你有權訪問連接表。爲此,將生成名爲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

+0

如果你正在使連接模型成爲一個模型,我喜歡嘗試找到一個比ticket_users更具表現力的名字(也許就像ticket_assignments)。 –

+0

感謝您的明確解釋。現在我訪問票證的創建者,以下列方式獲取他們的名字ticket.user.lName我將如何訪問分配的用戶? – Brian

+0

ticket.users返回一個數組。這意味着你可以做 ticket.users.each do | user | puts user.lName 結束 這將記錄用戶名 你也可以做一些像ticket.users.first.lName或ticket.users [3] .lName –

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 
+0

這對我現有的has_many模型有什麼影響:我的用戶的票和belongs_to:我的票的用戶?我需要將這些關係保留在機票原始創建者的模型中,還是在添加has_and_belongs_to_many時將其刪除? – Brian

+0

1。創建表'tickets_users'如顯示 2.更改爲has_many:到has_and_belongs_to_many的票證 3.將票據中的數據遷移到'tickets_users' 4.從票證中刪除user_id –

+0

我唯一不理解的是如果我這樣做我如何確定用戶最初創建的票證以及分配給用戶的用戶?門票中的user_id當前賦予門票的創建者。 – Brian

0

這可能工作分配的成員名單 - 在用戶和票證之間創建兩個關係,票證belongs_to創建者,:類別用戶和票證has_many assigned_users,class_name用戶和用戶模型has_many created_tickets和has_many assigned_tickets