如何根据.id获取.last对象



我有我的观点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 ordercreated_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

希望这对你有帮助!

相关内容

最新更新