Заказ ассоциаций has_and_belongs_to_many - PullRequest
9 голосов
/ 10 ноября 2009

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

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

@game.users << @user

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

@game.users.each do....

Мои вопросы:

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

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

Ответы [ 2 ]

19 голосов
/ 10 ноября 2009

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

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

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

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

11 голосов
/ 10 ноября 2009

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

...