Заказ ассоциаций has_and_belongs_to_many
В моем приложении rails у меня есть две модели, связанные has_and_belongs_to_many. Это означает, что есть таблица соединений.
Представьте себе сценарий, в котором я добавляю пользователей в игру. Если я хочу добавить пользователя, я делаю:
@game.users << @user
Предположим, что я хочу знать, в каком порядке я добавил этих пользователей. Я могу сделать это:
@game.users.each do....
Мои вопросы:
Гарантируется ли порядок, если этот список будет читаться одинаково каждый раз?
Если это так, как можно изменить порядок пользователей в игре?
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
метка времени для этих отношений управляется рельсами.