Заказ has_and_belongs_to_many ассоциации
-
19-09-2019 - |
Вопрос
В моем приложении Rails у меня есть две модели, которые связаны с has_and_belongs_to_many. Это означает, что есть таблица соединения.
Представьте себе сценарий, в котором я добавляю пользователей в игру. Если я хочу добавить пользователя, я сделаю:
@game.users << @user
Предположим, что я хочу знать, в каком порядке я добавил этих пользователей. Я могу сделать это:
@game.users.each do....
Мои вопросы:
Является ли заказ, если этот список гарантированно будет читать одинаково каждый раз?
Если это так, что такое чистый способ переупорядочить пользователей в игре?
Решение
Чтобы расширить на дне ответа Даниво:
Если вы хотите заказать к тому времени, когда они будут добавлены в этот список, я рекомендую вместо использования 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
flay_game.rb
belongs_to :game
belongs_to :user
Конечно, изменения в именах ...
в популярные игры Таблица, если у вас есть столбец под названием created_at
секунда has_many
В играх будет заказывать эту область и вернуть пользователей в том порядке, в котором они были добавлены в игру.
Другие советы
Я не уверен, но я бы сказал, что заказ гарантированно будет таким же, как ваша база данных гарантирует порядок результата, установленного без предложения по заказу по предложению.
Вы можете добавить :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
Неэппаратная метка этих отношений управляется Rails.