如何减少Ruby on Rails代码中的重复?

时间:2009-08-03 09:31:15

标签: ruby-on-rails dry

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

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

像往常一样感谢

2 个答案:

答案 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])