Ruby on rails 如何在不使用联接模型的情况下,按同一模型上的列对模型上的所有对象进行分组?
我有一个模型位置,其模式如下:Ruby on rails 如何在不使用联接模型的情况下,按同一模型上的列对模型上的所有对象进行分组?,ruby-on-rails,activerecord,ruby-on-rails-5,Ruby On Rails,Activerecord,Ruby On Rails 5,我有一个模型位置,其模式如下: # Table name: positions # # id :bigint not null, primary key # action :integer # current_price :float # current_value :float # status :integer default("0") # ticker
# 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
我的用户模型如下所示:
has_one :portfolio, dependent: :destroy
has_many :positions, through: :portfolio, dependent: :destroy
class Portfolio < ApplicationRecord
belongs_to :user
has_many :positions
end
我的投资组合模型如下所示:
has_one :portfolio, dependent: :destroy
has_many :positions, through: :portfolio, dependent: :destroy
class Portfolio < ApplicationRecord
belongs_to :user
has_many :positions
end
但是,在理想情况下,我只想在第一个查询中执行此操作
我尝试了以下方法,但都不起作用
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.name'不适合您,因为您需要按positions tables ticker列进行分组
@positions\u group\u by\u ticker=当前用户.positions.buy.open.group'positions.ticker'.ordertransaction\u日期::desc
使用组将返回数组数组,而不是AR集合
# view.html.erb
@grouped_positions.each do |stock_positions|
<%= render stock_positions %>
end
在位置表中是否有一列称为ticker?如果不加入,你将如何分组?是的,在问题顶部的模式表中查找positions.ticker是positions中的一列,tickers.name来自哪里?@SebastianPalma。那是错误的。我更新了问题以删除它。它仍然返回一个类似的AR关联对象,这对我没有多大帮助。您使用的是什么RDBMS?那么当前用户.positions.buy.open.选择'distinct on positions.ticker*'?当我尝试这个时,它不起作用。ActiveRecord::StatementInvalid:PG::GroupingError:ERROR:column positions.id必须出现在GROUP BY子句中,或用于聚合函数行1:SELECT positions.*从positions内部加入公文包…啊,我明白了!我已经更新了上面的查询。这个人也有类似的问题