Rails 向现有查询添加除法计算

Rails add divide calculation to existing query

我有一个查询,其中我提取了投资组合的所有用户,如下所示:

class PortfolioShareholdersQuery
  def initialize(portfolio)
    @portfolio = portfolio
  end

  def call
    User.joins(:cash_transactions)
        .where(cash_transactions: { to_wallet: portfolio.wallet })
        .select('users.*, SUM(cash_transactions.shares_number) as total_shares_number')
        .group('users.id')
  end

  attr_reader :portfolio
end

是否可以在上面的查询中添加一行,如下所示对两个数字进行除法?

(user.total_shares_number / portfolio.portfolio_setup_infos.last.total_shares_sold)

# total_shares_number comes from first select
# portfolio_setup_infos is a has_many relation to portfolio

[编辑]

#models association
class User < ApplicationRecord
  has_one  :wallet, as: :walletable
  has_many :cash_transactions, through: :wallet
end

class Portfolio < ApplicationRecord
  has_one  :wallet, as: :walletable
end

class Wallet < ApplicationRecord
  belongs_to :walletable, polymorphic: true

  has_many   :cash_transactions
end

class CashTransaction < ApplicationRecord
  belongs_to :wallet
  belongs_to :to_wallet, class_name: 'Wallet', optional: true
end

[编辑 2]

> divisor = portfolio.portfolio_setup_infos.last.total_shares_sold
  PortfolioSetupInfo Load (0.5ms)  SELECT "portfolio_setup_infos".* FROM "portfolio_setup_infos" WHERE "portfolio_setup_infos"."portfolio_id" =  ORDER BY "portfolio_setup_infos"."id" DESC LIMIT   [["portfolio_id", 6], ["LIMIT", 1]]
 => 263

> shareholders = User.joins(:cash_transactions).where(cash_transactions: { to_wallet: portfolio.wallet }).select("users.*, SUM(cash_transactions.shares_number) as total_shares_number, (total_shares_number/#{divisor}").group('users.id')
  Wallet Load (0.6ms)  SELECT "wallets".* FROM "wallets" INNER JOIN "spv_setups" ON "wallets"."walletable_id" = "spv_setups"."id" WHERE "spv_setups"."portfolio_id" =  AND "wallets"."walletable_type" =  LIMIT   [["portfolio_id", 6], ["walletable_type", "SpvSetup"], ["LIMIT", 1]]
  User Load (3.3ms)  SELECT users.*, SUM(cash_transactions.shares_number) as total_shares_number, (total_shares_number/263 FROM "users" INNER JOIN "wallets" ON "wallets"."walletable_type" =  AND "wallets"."walletable_id" = "users"."id" INNER JOIN "cash_transactions" ON "cash_transactions"."wallet_id" = "wallets"."id" WHERE "cash_transactions"."to_wallet_id" =  GROUP BY "users"."id" /* loading for inspect */ LIMIT   [["walletable_type", "User"], ["to_wallet_id", 8], ["LIMIT", 11]]
Traceback (most recent call last):
ActiveRecord::StatementInvalid (PG::SyntaxError: ERROR:  syntax error at or near "FROM")
LINE 1: ... as total_shares_number, (total_shares_number/263 FROM "user...
                                                         ^
class Portfolio < ApplicationRecord
  def divisor
    portfolio_setup_infos.last.total_shares_sold
  end
end

class PortfolioShareholdersQuery
  def initialize(portfolio)
    @portfolio = portfolio
    @divisor = portfolio.divisor.to_f
  end

  def call
    select =<<-SEL.squish
                 users.*,
                 SUM(cash_transactions.shares_number) as total_shares_number,
                 (SUM(cash_transactions.shares_number)/#{divisor}) as ratio
              SEL

    User.joins(:cash_transactions)
        .where(cash_transactions: { to_wallet: portfolio.wallet })
        .select(select)
        .group('users.id')
  end

  attr_reader :portfolio, :divisor
end