Вопрос

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

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

@game.users << @user

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

@game.users.each do....

Мои вопросы:

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

  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

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top