ruby-on-rails - 如何在不使用连接模型的情况下按同一模型上的列对模型上的所有对象进行分组?
问题描述
我有一个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
由 的 分组的 allticker
的所有位置position
,而不必join
在stock
模型上执行 a 作为数组或某些 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.group('positions.ticker').order(transaction_date: :desc)
Usinggroup
将返回一个数组数组,而不是 AR 集合。
# view.html.erb
@grouped_positions.each do |stock_positions|
<%= render stock_positions %>
end
推荐阅读
- sql - 编写查询以打印一年中的最后一个日期,输入将是任何日期
- data-science - 在特征选择期间要删除哪些特征
- python - 为什么 python 不为其关联的 --hhelp 使用自己的 argparse 库?
- matlab - 如何并行运行代码?(通过VISA和RS232与设备通信
- javascript - rxjs 合并 http 响应
- c++ - 为什么 hashmap 的名称中有“hash”?
- electron - 为什么我的 Echarts 用 Electron 配置的 index.html 不起作用?
- python - 基于现有列创建新列。使用 1 或 0
- r - 跨多列对变量进行排序和排名
- c++ - 为什么 cpp 中的 size_t 被命名为“size_t”?