2010-05-18 127 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