Ruby on Rails更新连接表记录

时间:2010-05-18 10:04:27

标签: ruby-on-rails ruby join associations

我有两个模型UsersRoles。我在两个模型之间建立了多对多的关系,我有一个名为roles_users的联合表。

我在页面上有一个表单,其中包含用户选中复选框的角色列表,然后它会发布到控制器,然后控制器会更新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通过post,我也注意到如果所有复选框都被选中并且表单发布它不断添加重复记录,任何人都可以提供一些建议以更有效的方式做到这一点?

1 个答案:

答案 0 :(得分:2)

你可以直接分配,因为它可以为你处理肮脏的工作:

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

ActiveRecord应该负责创建新关联或删除不再列出的关联。如果有任何事情阻止您的联接模型保存,例如验证失败,您可能会遇到问题,但在大多数情况下,这应该按预期工作。

我希望你使用has_many ...,:通过这个而不是被弃用的has_and_belongs_to_many因为旧的示例代码而一直困扰着这么多Rails应用程序。