簡體   English   中英

帶有參數的Rails復雜order_by

[英]rails complex order_by with argument

我有一個Rails應用程序。 我想顯示按用戶與當前用戶的常見任務數量排序的用戶個人資料。 每個任務都有一個分配器和一個執行器。 該數字應同時包含同一用戶的executedtasks和assigned_tasks。 因此,例如,如果current_user為User4分配了5個任務,而User4為current_user分配了3個任務,那么該數字將為8。

我的主要問題是我不知道如何使用給定用戶作為arg進行計數。 我應該以某種方式還是在控制器中設置實例變量(@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM