这是我应用程序中更新方法的代码片段。该方法在params [:assigned_ users_ list_ id]
中POST一个用户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
它很棒 - 很棒!
我的第一个问题是,那些“if”和“除非”陈述 完全 是多余的,还是谨慎地将它们留在原地?
我的下一个问题是,我想在此之后立即重复这个完全代码,但是用'subscribed'代替'assigned'...为了实现这个目的,我只是做了一个发现&amp;在我的文本编辑器中替换,在我的应用程序中留下几乎这个代码两次。这几乎与DRY校长保持一致!
为了清楚起见,'指定'字母的每个实例都成为'订阅'。它传递给params [:subscribed_ users_ list_ id],并使用@ task.subscribed_ users.delete用户等...
如何在不重复的情况下重复此代码?
像往常一样感谢
答案 0 :(得分:2)
您不需要if和unless语句。 至于重复,你可以制作代表你需要的哈希数组。 像这样:
[
{ :where_clause => params[:assigned_users_list_id], :user_list => @task.assigned_users} ,
{ :where_clause => params[:subscribed_users_list_id], :user_list => @task.subscribed_users}
] each do |list|
@list_users = User.find(:all, :conditions => { :id => list[:where_clause] })
@users_to_remove = list[:user_list] - @list_users
@users_to_add = @list_users - list[:user_list]
@users_to_add.each do |user|
list[:user_list] << user
end
@users_to_remove.each do |user|
list[:user_list].delete user
end
end
我的变量名称不是最快乐的选择,因此您可以更改它们以提高可读性。
答案 1 :(得分:1)
我似乎在这里遗漏了一些东西,但你不只是这样做吗?
@task.assigned_users = User.find(params[:assigned_users_list_id])