rails 复杂 order_by 带参数
rails complex order_by with argument
我有一个 rails 应用程序。我想显示按他们与当前用户的常见任务数量排序的用户配置文件。每个任务都有一个分配者和一个执行者。该数字应包括同一用户的 executed_tasks 和 assigned_tasks。因此,例如,如果 current_user 向 User4 分配了 5 个任务,而 User4 向 current_user 分配了 3 个任务,那么这个数字将为 8。
我的主要问题是我不知道如何将给定用户用作计数参数。我应该以某种方式在模型中做还是当我在控制器中设置实例变量(@users)时做?
task.rb
belongs_to :assigner, class_name: "User"
belongs_to :executor, class_name: "User"
scope :between, -> (assigner_id, executor_id) do
where("(tasks.assigner_id = ? AND tasks.executor_id = ?) OR (tasks.assigner_id = ? AND tasks.executor_id = ?)", assigner_id, executor_id, executor_id, assigner_id)
end
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
假设您希望通过单个 SQL 查询来执行此操作以提高性能,您可以执行以下操作:
class User < ActiveRecord::Base
def assigners
Task.where(executor_id: id).select('assigner_id AS user_id')
end
def executors
Task.where(assigner_id: id).select('executor_id AS user_id')
end
def relations_sql
"((#{assigners.to_sql}) UNION ALL (#{executors.to_sql})) AS relations"
end
def ordered_relating_users
User.joins("RIGHT OUTER JOIN #{relations_sql} ON relations.user_id = users.id")
.group(:id)
.order('COUNT(relations.user_id) DESC')
end
end
由于评论要求考虑不相关的用户,并且限制为 6 个,所以有点棘手,因为我们使用 FULL_OUTER_JOIN
。编辑后的函数将是:
def ordered_relating_users
User.joins("FULL OUTER JOIN #{relations_sql} ON relations.user_id = users.id")
.where.not(id: id)
.group(:id)
.order('COUNT(relations.user_id) DESC')
.limit(6)
end
我有一个 rails 应用程序。我想显示按他们与当前用户的常见任务数量排序的用户配置文件。每个任务都有一个分配者和一个执行者。该数字应包括同一用户的 executed_tasks 和 assigned_tasks。因此,例如,如果 current_user 向 User4 分配了 5 个任务,而 User4 向 current_user 分配了 3 个任务,那么这个数字将为 8。
我的主要问题是我不知道如何将给定用户用作计数参数。我应该以某种方式在模型中做还是当我在控制器中设置实例变量(@users)时做?
task.rb
belongs_to :assigner, class_name: "User"
belongs_to :executor, class_name: "User"
scope :between, -> (assigner_id, executor_id) do
where("(tasks.assigner_id = ? AND tasks.executor_id = ?) OR (tasks.assigner_id = ? AND tasks.executor_id = ?)", assigner_id, executor_id, executor_id, assigner_id)
end
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
假设您希望通过单个 SQL 查询来执行此操作以提高性能,您可以执行以下操作:
class User < ActiveRecord::Base
def assigners
Task.where(executor_id: id).select('assigner_id AS user_id')
end
def executors
Task.where(assigner_id: id).select('executor_id AS user_id')
end
def relations_sql
"((#{assigners.to_sql}) UNION ALL (#{executors.to_sql})) AS relations"
end
def ordered_relating_users
User.joins("RIGHT OUTER JOIN #{relations_sql} ON relations.user_id = users.id")
.group(:id)
.order('COUNT(relations.user_id) DESC')
end
end
由于评论要求考虑不相关的用户,并且限制为 6 个,所以有点棘手,因为我们使用 FULL_OUTER_JOIN
。编辑后的函数将是:
def ordered_relating_users
User.joins("FULL OUTER JOIN #{relations_sql} ON relations.user_id = users.id")
.where.not(id: id)
.group(:id)
.order('COUNT(relations.user_id) DESC')
.limit(6)
end