我有一个带有以下型号的Rails 5.1应用程序:
class Game < ApplicationRecord
has_and_belongs_to_many :players
end
class Player < ApplicationRecord
has_and_belongs_to_many :games
end
我在测试期间使用Game
方法之一看到以下行为(使用标准灯具+ minitest):
def foo
puts "players.first: #{players.first.id}, #{players.first.name}"
puts "players.second: #{players.second.id}, #{players.second.name}"
puts "players.last: #{players.last.id}, #{players.last.name}"
players.each_cons(2) do |pair|
puts "<<each_cons>> one: #{pair.first.id}, #{pair.first.name} - two: #{pair.second.id}, #{pair.second.name}"
end
end
输出:
players.first: 101088061, julia
players.second: 132733334, clara
players.last: 931424614, felix
<<each_cons>> one: 931424614, felix - two: 132733334, clara
<<each_cons>> one: 132733334, clara - two: 101088061, julia
我希望通过julia, clara
然后clara, felix
来调用它。这种逆转的原因是什么原因?
答案 0 :(得分:3)
当您致电players.first
时,您可能会收到一个选择order by "players"."id" ASC LIMIT 1
的玩家的查询。
当您致电second
时,您可能会获得order by "players"."id" ASC LIMIT 1 OFFSET 1
。
当您致电players
时,您不会应用此订单。
如果这不是你想要的行为,那么定义:
@players = players.order(:id)
...然后@players.first
和@players.second
会给出与@players
的顺序一致的值,因为您将使用first
和{的数组实现{1}}。
检查SQL语句的日志以确定。