【发布时间】:2015-11-16 21:01:07
【问题描述】:
我有一个带有以下模型的 rails 应用程序。我有给定用户的assigned_tasks 和executed_tasks。我想知道哪个选项更适合为给定用户获取所有任务(执行和分配)。
task.rb
belongs_to :assigner, class_name: "User"
belongs_to :executor, class_name: "User"
用户.rb
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
解决方案 1:
task.rb
scope :completed, -> { where.not(completed_at: nil) }
scope :uncompleted, -> { where(completed_at: nil) }
用户.rb
def tasks_uncompleted
tasks_uncompleted = assigned_tasks.uncompleted.order("deadline DESC")
tasks_uncompleted += executed_tasks.uncompleted.order("deadline DESC")
tasks_uncompleted.sort_by { |h| h[:deadline] }.reverse!
end
tasks_controller:
@tasks = current_user.tasks_uncompleted.paginate(page: params[:page], per_page: 12)
解决方案 2:
task.rb
scope :completed, -> { where.not(completed_at: nil) }
scope :uncompleted, -> { where(completed_at: nil) }
scope :alltasks, -> (u) { where('executor_id = ? OR assigner_id = ?', u.id, u.id) }
tasks_controller
@tasks = Task.alltasks(current_user).uncompleted.order("deadline DESC").paginate(page: params[:page], per_page: 12)
【问题讨论】:
-
第二个要好得多,虽然
Task.alltasks(current_user)很臭。在User上拥有一个all_tasks关系来实现同样的事情会更干净,例如current_user.all_tasks.uncompleted.... -
+1 表示第二个选项,-1 表示解决方案 #2,
Task#alltasks可能应该是Task.for_user(current_user) ... -
@MrYoshiji,你认为问题只是第二个的命名?
-
是的,但正如乔丹所说,在您的控制器和其他可以使用
current_user的地方,您应该使用类似current_user.all_tasks.uncompleted的东西,其中User#all_tasks是在User模型返回中定义的范围分配或创建的任务(就像乔丹在他的回答中发布的那样)。 --- 编辑:实际上@Jordan 在他的回答中总结了所有内容,我会按照他的建议去做。
标签: sql ruby-on-rails activerecord chaining