【发布时间】:2020-08-25 14:48:38
【问题描述】:
我目前正在尝试在 Rails 应用程序上列出不同的资产。我想访问每个资产的名称和最后一个值,所有这些都按市值排序。
这是我的数据库结构
`create_table "asset_values", force: :cascade do |t|
t.integer "date"
t.integer "asset_id"
t.float "price"
t.float "marketcap"
t.float "volume"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
create_table "assets", force: :cascade do |t|
t.string "name"
t.string "symbol"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end`
日期是unix时间
这是我的资产对应的模型结构
has_many :asset_value
validates :name, :symbol, uniqueness: true
validates :name, :symbol, presence: true
这是我与asset_values对应的模型结构
belongs_to :asset, foreign_key: "asset_id"
示例:
Assets:
id: 1, name: Bitcoin, symbol: BTC
id: 2, name: Ethereum, symbol: ETH
Asset_values:
id:1, price: 12000, marketcap: 211 000 000 000, volume 100, asset_id: 1, date: 1 598 300 000
id:2, price: 11000, marketcap: 210 000 000 000, volume 110, asset_id: 1, date: 1 598 200 000
id:3, price: 400, marketcap: 42 000 000 000, volume 20, asset_id: 2, date: 1 598 300 000
id:4, price: 420, marketcap: 43 000 000 000, volume 20, asset_id: 2, date: 1 598 200 000
The_table_i_want :
id: 1, name: Bitcoin, symbol: BTC, price: 12000, marketcap: 211 000 000 000, volume 100, date: 1 598 300 000
id: 2, name: Ethereum, symbol: ETH, price: 400, marketcap: 42 000 000 000, volume 20, date: 1 598 300 000
我尝试了不同的调用来访问数据,但它们都不起作用... 这是我认为最好的
sql = ("
SELECT a.id, a.name, a.symbol, v.price, v.marketcap, v.volume, v.date
FROM assets AS a
INNER JOIN asset_values AS v ON a.id = v.asset_id
INNER JOIN (
SELECT MAX(date)
FROM asset_values
GROUP BY asset_id
) AS p
ON a.id = p.asset_id
ORDER BY v.marketcap DESC
")
@data = ActiveRecord::Base.connection.execute(sql)
我正在使用 postgresql 和 rails 6
【问题讨论】:
-
我认为最好将最新的市值市值保存在资产表中,这样您就可以进行非常简单的查询。
Asset.order('marketcap desc') -
可以,但我更喜欢没有重复的干净数据库;-)
标签: sql ruby-on-rails ruby postgresql