2016-05-13 5 views
1

私はスコープとコントローラーをリファクタリングしようとしていますが、それが良いと感じています。コントローラの観点からは、新しいコードは間違いなく良いですが、私はalltasksスコープとall_uncompleted_tasks_ordered_by_deadlineインスタンスメソッドはちょっと変わっていると思います。何か案は?ARのクエリのリファクタリング

ユーザ:

has_many :assigned_tasks, class_name: "Task", foreign_key: "assigner_id", dependent: :destroy 
has_many :executed_tasks, class_name: "Task", foreign_key: "executor_id", dependent: :destroy 

タスク:

belongs_to :assigner, class_name: "User" 
belongs_to :executor, class_name: "User" 
scope :alltasks, -> (u) { where('executor_id = ? OR assigner_id = ?', u.id, u.id) } 
scope :uncompleted, -> { where(completed_at: nil) } 

タスクコントローラ

def index 
    @tasks = Task.alltasks(current_user).uncompleted.includes(:executor, :executor_profile, :assigner, :assigner_profile).order("deadline DESC") 
end 

新しいコード:

user.rb

def all_uncompleted_tasks_ordered_by_deadline 
    Task.alltasks(self).uncompleted.includes(:executor, :executor_profile, :assigner, :assigner_profile).order("deadline DESC") 
end 

タスクコントローラ

def index 
    @tasks = current_user.all_uncompleted_tasks_ordered_by_deadline 
end 

答えて

1

私はむしろall_tasksが割り当て実行がすでにあるようなUserモデルになりたいと思います。たぶんあなたはそこにメソッドとして移動し、必要なコントローラにTaskスコープを適用することができます。

は言う:

#user.rb 
def all_tasks 
    Task.where('executor_id = ? OR assigner_id = ?', id, id) 
end 

#tasks_controller.rb 
def index 
    @tasks = current_user.all_tasks 
         .uncompleted.includes(:executor, :executor_profile, :assigner, :assigner_profile) 
         .order(deadline: :desc) 

end 
関連する問題