Заказ ассоциаций has_and_belongs_to_many

В моем приложении rails у меня есть две модели, связанные has_and_belongs_to_many. Это означает, что есть таблица соединений.

Представьте себе сценарий, в котором я добавляю пользователей в игру. Если я хочу добавить пользователя, я делаю:

@game.users << @user

Предположим, что я хочу знать, в каком порядке я добавил этих пользователей. Я могу сделать это:

@game.users.each do....

Мои вопросы:

  1. Гарантируется ли порядок, если этот список будет читаться одинаково каждый раз?

  2. Если это так, как можно изменить порядок пользователей в игре?

2 ответа

Решение

Чтобы расширить в нижней части ответа Даниво:

Если вы хотите сделать заказ к тому времени, когда они будут добавлены в этот список, то я рекомендую вместо использования 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"

user.rb

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

played_game.rb

belongs_to :game
belongs_to :user

Конечно, изменения ожидаются на имена...

В таблице Play_Games, если у вас есть столбец с именем created_at второй has_many В играх будут упорядочены по этому полю и возвращены пользователи в том порядке, в котором они были добавлены в игру.

Я не уверен, но я бы сказал, что порядок гарантированно будет таким же, как ваша база данных гарантирует порядок набора результатов без предложения 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 отношения, так что объединяющая таблица имеет собственную сущность. Тогда у вас будет created_on а также updated_on метка времени для этих отношений управляется рельсами.

Другие вопросы по тегам