我有我的观点duel.duelers.last
,它应该在决斗中以最后一个id抓取dueler
,但相反,如果一个决斗者更新了一个属性,那么无论其在id
中的顺序如何,该决斗者都将成为最后一个?
如何获取基于id
的最后一个dueler ?
pry(main)> Duel.last.duelers
=> [#<Dueler:0x007fa718513530
id: 310, # This is Duel.last.duelers.last but is listed first here
user_id: 2,
challenge_id: 398,
duel_id: 186,
#<Dueler:0x007fa718513288
id: 309, # This is Duel.last.duelers.first but is listed last here because it was most recently updated
user_id: 114,
challenge_id: 410,
duel_id: 186,
pry(main)> Duel.last.duelers.last
id: 310,
user_id: 2,
challenge_id: 398,
duel_id: 186,
pry(main)> Duel.last.duelers.first
id: 309,
user_id: 114,
challenge_id: 410,
duel_id: 186,
您想根据id获取最后一个决斗者,
无论最后更新表中的哪一列,基本查询都将按照duelers_id desc
Rails默认顺序:
在rails中,如果没有指定默认顺序,那么它们将根据数据库返回它们的方式进行排序。Usually this is by ID or insert order
。created_at/updated_at
列只有在您的迁移中指定时才会出现,因此将其作为默认的顺序列是没有意义的。
这是我为你做的一个例子。
Duel.last.duelers.last
Duel Load (0.5ms) SELECT `duels`.* FROM `duels` ORDER BY `duels`.`id` DESC LIMIT 1
Dueler Load (37.3ms) SELECT `duelers`.* FROM `duelers` WHERE `duelers`.`duel_id` = 1 ORDER BY `duelers`.`id` DESC LIMIT 1
该查询首先加载各自的决斗,然后通过dueler_id desc获取该决斗的最后一个决斗者订单。
检查查询,
SELECT
duelers .* FROM
duelers WHERE
duelers .
duel_id = 1 ORDER BY
duelers .
id DESC LIMIT 1
它总是按id desc排序,除非你指定了默认作用域。
在您的问题中,它以正确的顺序获得结果,即Id
你可以试试
Duel.last.duelers.order(id: :desc).first
或
Duel.last.duelers.order(created_at: :desc).first
希望这对你有帮助!