如何在不使用联接模型的情况下通过同一模型上的列将模型上的所有对象分组?

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

我有一个具有以下架构的模型Position

# Table name: positions
#
#  id                :bigint           not null, primary key
#  action            :integer
#  current_price     :float
#  current_value     :float
#  status            :integer          default("0")
#  ticker            :string
#  volume            :integer
#  created_at        :datetime         not null
#  updated_at        :datetime         not null
#  portfolio_id      :integer
#  stock_id          :integer

  belongs_to :portfolio
  belongs_to :stock

我的User模型看起来像这样:

  has_one :portfolio, dependent: :destroy
  has_many :positions, through: :portfolio, dependent: :destroy

我的Portfolio模型看起来像这样:

class Portfolio < ApplicationRecord
  belongs_to :user
  has_many :positions
end

[我想做的是将current_user的所有位置全部返回为tickerposition分组,而不必在join模型上执行stock作为数组。或一些我可以迭代的AR对象,并列出每个组中的每个AR对象。

我成功完成此操作的方法是:

@positions = current_user.positions.buy.open.order(transaction_date: :desc)
@grouped_stocks = @positions.joins(:stock).group_by { |ps| ps.stock.ticker }

但是,理想情况下,我只想在第一个查询中就这样做。

我尝试了以下操作,但它们都不起作用。

current_user.positions.buy.open.group("ticker")
=> #<Position::ActiveRecord_AssociationRelation:0x3ffdf189d6d4>

current_user.positions.buy.open.order(transaction_date: :desc).group("ticker.name")
      Position Load (2.9ms)  SELECT "positions".* FROM "positions" INNER JOIN "portfolios" ON "positions"."portfolio_id" = "portfolios"."id" WHERE "portfolios"."user_id" = $1 AND "positions"."action" = $2 AND "positions"."status" = $3 GROUP BY ticker.name ORDER BY "positions"."transaction_date" DESC  [["user_id", 2], ["action", 0], ["status", 0]]
  Position Load (2.3ms)  SELECT  "positions".* FROM "positions" INNER JOIN "portfolios" ON "positions"."portfolio_id" = "portfolios"."id" WHERE "portfolios"."user_id" = $1 AND "positions"."action" = $2 AND "positions"."status" = $3 GROUP BY ticker.name ORDER BY "positions"."transaction_date" DESC LIMIT $4  [["user_id", 2], ["action", 0], ["status", 0], ["LIMIT", 11]]
=> #<Position::ActiveRecord_AssociationRelation:0x3ffdefe0a7a4>

我该怎么做?

编辑

请参见下面的示例屏幕快照,了解如何组织结果:

screenshot-of-data-layout

ruby-on-rails activerecord ruby-on-rails-5
1个回答
0
投票

我看到您在位置表上有ticker,但没有stocks表。因此,如果是这种情况,则无需查看stocks表。 (将它放在股票表上可能更好)上面也没有列出transaction_date,因此我认为它在positions表格上。

[这或多或少是我所假设的,因为您需要按group('ticker.name')positions列分组,所以ticker不适用于您。

@positions_grouped_by_ticker = current_user.positions.buy.open.order(transaction_date: :desc).group(:ticker)

使用group将返回数组数组,而不是AR集合。

# view.html.erb
@grouped_positions.each do |stock_positions|
  <%= render stock_positions %>
end
© www.soinside.com 2019 - 2024. All rights reserved.