这是我的应用程序中更新方法的代码片段。该方法在 params[:assigned_users_list_id] 中发布了一个用户 ID 数组
这个想法是通过删除正确的条目(那些存在于数据库中但不在列表中的条目)并添加正确的条目(反之亦然),将数据库关联条目与刚刚提交的条目同步。
@list_assigned_users = User.find(:all, :conditions => { :id => params[:assigned_users_list_id]})
@assigned_users_to_remove = @task.assigned_users - @list_assigned_users
@assigned_users_to_add = @list_assigned_users - @task.assigned_users
@assigned_users_to_add.each do |user|
unless @task.assigned_users.include?(user)
@task.assigned_users << user
end
end
@assigned_users_to_remove.each do |user|
if @task.assigned_users.include?(user)
@task.assigned_users.delete user
end
end
它有效 - 太棒了!
我的第一个问题是,那些“如果”和“除非”语句是完全多余的,还是将它们留在原处是否明智?
我的下一个问题是,我想在此之后立即重复这个确切的代码,但是用'subscribed'代替'assigned'......为了实现这一点,我只是在我的文本编辑器中进行了查找和替换,几乎留下了这个我的应用程序中的代码两次。这几乎不符合 DRY 原则!
为了清楚起见,字母“分配”的每个实例都变成了“订阅”。它通过 params[:subscribed_users_list_id],并使用@task.subscribed_users.delete user 等...
如何在不重复的情况下重复此代码?
像往常一样感谢