これは、私のアプリケーションの更新メソッドからのコードのスニペットです。このメソッドは、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などを使用します。
このコードを繰り返さずに繰り返すにはどうすればよいですか?
いつもありがとう