1

这是我的应用程序中更新方法的代码片段。该方法在 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 等...

如何在不重复的情况下重复此代码?

像往常一样感谢

4

2 回答 2

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

我的变量名不是最愉快的选择,因此您可以更改它们以提高可读性。

于 2009-08-03T10:43:19.540 回答
1

我似乎在这里遗漏了一些东西,但你不只是这样做吗?

@task.assigned_users = User.find(params[:assigned_users_list_id])
于 2009-08-03T21:57:33.460 回答