rails 重构 AR 查询

rails refactoring AR query

我正在尝试重构我的示波器和我的控制器,但我觉得它可以做得更好。从控制器的角度来看,新代码肯定更好,但我认为 alltasks 范围和 all_uncompleted_tasks_ordered_by_deadline 实例方法有点奇怪。有什么想法吗?

用户:

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

我宁愿认为 all_tasks 想要在用户模型中,就像已经分配和执行的一样。也许您可以将它作为方法移动到那里并在控制器中应用所需的 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