订购has_and_belongs_to_many关联

cma*_*han 9 ruby-on-rails has-and-belongs-to-many rails-activerecord

在我的rails应用程序中,我有两个与has_and_belongs_to_many相关的模型.这意味着有一个连接表.

想象一下我在游戏中添加用户的场景.如果我想添加用户,我会:

@game.users << @user
Run Code Online (Sandbox Code Playgroud)

假设我想知道我添加这些用户的顺序.我可以做这个:

@game.users.each do....
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 如果此列表保证每次都以相同的方式读取,是否排序?

  2. 如果是这样的话,那么在游戏中重新排序用户的干净方法是什么?

Rya*_*igg 19

扩展danivo答案的底部:

如果你想在它们被添加到这个列表时订购,那么我建议has_and_belongs_to_many你不要使用你实际使用的has_many :through:

game.rb

has_many :played_games
has_many :users, :through => :played_games, :order => "played_games.created_at ASC"
Run Code Online (Sandbox Code Playgroud)

user.rb

has_many :played_games
has_many :games, :through => :played_games
Run Code Online (Sandbox Code Playgroud)

played_game.rb

belongs_to :game
belongs_to :user
Run Code Online (Sandbox Code Playgroud)

当然,名称上有待更改......

playback_games表中,如果你在游戏中有一个名为created_at第二列的列has_many将按此字段排序,并按照添加到游戏中的顺序返回用户.


dan*_*ich 11

我不确定,但我会说保证顺序与数据库相同,保证结果集的顺序没有order by子句.

您可以:order => "last_name, first_name asc":has_and_belongs_to_many关系语句中添加a .这将为返回的项目的顺序设置默认行为.

您还可@game.users.find(:all, :order => "last_name, first_name asc")以为您需要的常见排序执行或创建命名范围.查看api了解详情

如果知道添加它们的顺序非常重要,那么您可能希望切换到has_many :through关系,以便连接表具有自己的实体.然后,你将有一个created_onupdated_on时间戳这种关系的轨道管理.