2010-05-18 109 views
0

我有兩個模型UsersRoles。我已經建立了兩種模型之間的多對多關係,並且我有一個名爲roles_users的聯合表。Ruby on Rails更新連接表記錄

我在頁面上有一個表格,其中包含用戶檢查複選框的角色列表,並將其發佈到控制器,然後更新roles_users表。

在我更新方法的那一刻,我這樣做是因爲我不知道更好的辦法:

role_ids = params[:role_ids] 
user.roles.clear 
role_ids.each do |role| 
    user.roles << Role.find(role) 
end unless role_ids.nil? 

所以我清除所有條目出來,然後循環扔從發送的所有角色ID通過郵政形式,我也注意到,如果所有的複選框被選中並且發佈的表單不斷添加重複記錄,那麼是否有人可以通過更有效的方式提供一些建議?

回答

2

你可以做一個直接分配,因爲這會爲你骯髒的工作:

user.roles = params[:role_ids].present? ? Role.find_all_by_id(params[:role_ids]) : [ ] 

的ActiveRecord應該注意創造新的協會或刪除那些不再列出的。如果有任何事情阻止了你的連接模型被保存,比如驗證失敗,你可能會遇到問題,但在大多數情況下,這應該按預期工作。

我希望你使用has_many ...,通過這個,而不是過時的has_and_belongs_to_many,由於舊的示例代碼,不斷推出這麼多的Rails應用程序。

+0

乾杯,完美的作品,我實際上使用has_and_belongs許多,但閱讀:通過方法,並將其移動到那。再次感謝。 – RailsSon 2010-05-19 10:58:06

+0

應該是user.roles = params [:roles_ids] .present? ? Role.find_all_by_id(params [:roles_ids]):[] – user938363 2012-01-25 03:34:08

+0

是的,你是對的。編輯! – tadman 2012-01-25 15:21:55