2017-07-09 25 views
1

我有以下型號一個Rails 5.1應用:順序(2)

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。這個逆序的原因是什麼?

回答

3

當您撥打players.first時,您可能會收到一個查詢,選擇order by "players"."id" ASC LIMIT 1的玩家。您可能會收到order by "players"."id" ASC LIMIT 1 OFFSET 1

當您撥打players時,您不會收到此順序。

如果這不是你想要的,則行爲定義:

@players = players.order(:id) 

...然後@players.first@players.second會給你從@players得到,因爲你將要使用的數組實現順序一致的值firstsecond

請確認SQL語句的日誌。