我有一个用户表和一个合同表,它们之间的关系如下:
用户.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中排序没问题,可以运行这段代码:
@users = User.all.sort{|a,b| a.current_year_contracts <=> b.current_year_contracts}
如果您需要 SQL 排序,我们需要知道使用什么数据库服务器。
@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
逻辑。同样,这取决于你的逻辑,但我已经给了你你所要求的。所以我在这里的工作完成了。 ✅
祝您学习愉快,如果您喜欢,请为这个解决方案投票! 😋