1

これは、私のアプリケーションの更新メソッドからのコードのスニペットです。このメソッドは、params [:assigned_ users_list_id]内のユーザーIDの配列にPOSTされます。

アイデアは、正しいもの(DBには存在するがリストにはないもの)を削除し、正しいものを追加する(その逆)ことによって、DBアソシエーションエントリを送信されたばかりのエントリと同期させることです。

    @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」および「unless」ステートメントは完全に冗長ですか、それともそのままにしておくのが賢明ですか?

次の質問は、この直後にこの正確なコードを繰り返したいのですが、「割り当てられた」の代わりに「サブスクライブ」を使用します...これを実現するために、テキストエディタで検索と置換を行っただけで、ほぼこれが残ります私のアプリで2回コーディングします。それはDRYプリンシパルとほとんど一致していません!

明確にするために、「割り当てられた」という文字のすべてのインスタンスは「サブスクライブされた」になります。params [:subscribed_ users_ list_ id]が渡され、@ task.subscribed_users.deleteuserなどを使用します。

このコードを繰り返さずに繰り返すにはどうすればよいですか?

いつもありがとう

4

2 に答える 2

2

if ステートメントと until ステートメントは必要ありません。繰り返しに関しては、必要なものを表すハッシュの配列を作成できます。このような:

   [ 
    { :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 に答える