10

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

想象一下我将用户添加到游戏中的场景。如果我想添加一个用户,我会:

@game.users << @user

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

@game.users.each do....

我的问题是:

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

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

4

2 回答 2

20

要扩展 danivo 答案的底部:

如果您想在它们被添加到此列表时订购,那么我建议您不要使用 ahas_and_belongs_to_many而是实际使用 a has_many :through

游戏.rb

has_many :played_games
has_many :users, :through => :played_games, :order => "played_games.created_at ASC"

用户.rb

has_many :played_games
has_many :games, :through => :played_games

玩过的游戏.rb

belongs_to :game
belongs_to :user

当然,名称的更改待定...

played_games表中,如果您有一个名为created_atsecond has_manyin games 的列,将按此字段排序,并按照用户添加到游戏中的顺序返回用户。

于 2009-11-10T02:57:14.613 回答
12

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

您可以:order => "last_name, first_name asc":has_and_belongs_to_many关系声明中添加一个。这将为返回的项目的顺序设置默认行为。

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

如果知道添加它们的顺序真的很重要,您可能希望切换到has_many :through关系,以便连接表拥有自己的实体。然后,您将拥有由 rails 管理的该关系的时间戳created_onupdated_on

于 2009-11-09T23:26:57.697 回答