each_cons的对的顺序(2)

时间:2017-07-09 22:23:34

标签: ruby-on-rails ruby rails-activerecord

我有一个带有以下型号的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来调用它。这种逆转的原因是什么原因?

1 个答案:

答案 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语句的日志以确定。