我有一个具有以下架构的模型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
的所有位置全部返回为ticker
的position
分组,而不必在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>
我该怎么做?
编辑
请参见下面的示例屏幕快照,了解如何组织结果:
我看到您在位置表上有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