使用 rails 模型中定义的方法对结果进行排序

问题描述 投票:0回答:2

我有一个用户表和一个合同表,它们之间的关系如下:

用户.rb

has_many :contracts

def current_year_contracts
 total = 0
 contracts.where('entry_date >= ?', Date.current.beginning_of_year).each do |entry|
   total += entry.total_number.to_f
 end
 total
end

合同.rb

belongs_to :user, optional: true

我这里面临的问题是如何使用current_year_contracts对用户进行升序或降序排序

@users = User.all.order(users.current_year_contracts "#{direction}")

方向是可以上升或下降。

ruby-on-rails sorting ruby-on-rails-5
2个回答
0
投票

如果在Ruby中排序没问题,可以运行这段代码:

@users = User.all.sort{|a,b| a.current_year_contracts <=> b.current_year_contracts}

如果您需要 SQL 排序,我们需要知道使用什么数据库服务器。


0
投票
@users = User.joins(:contracts)
         .where('contracts.entry_date >= ?', Date.current.beginning_of_year)
         .group('users.id')
         .order('SUM(contracts.total_number) DESC')

使其更可重复使用

您可以创建一个范围并将逻辑移到那里您可以做的是

class User < ApplicationRecord
  scope :order_by_current_year_contracts, -> do
    joins(:contracts)
    .where('contracts.entry_date >= ?', Date.current.beginning_of_year)
    .group('users.id')
    .order('SUM(contracts.total_number) DESC')
  end
end

只需使用

User.order_by_current_year_contracts
哇!!!! 🤯

但是如果我想获取 ASC 顺序的列表怎么办? 😱 我有你

User.order_by_current_year_contracts.reverse_order
😎

P.s:如果您真的只想检索当年的合同,则需要修改查询中的

current_year
逻辑。同样,这取决于你的逻辑,但我已经给了你你所要求的。所以我在这里的工作完成了。 ✅

祝您学习愉快,如果您喜欢,请为这个解决方案投票! 😋

© www.soinside.com 2019 - 2024. All rights reserved.