Упорядочить ассоциации HABTM с помощью create_at для ассоциации вместо объекта - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть модели Match и User с has_and_belongs_to_many между ними.

Как мне получить match.users.first и match.users.second в зависимости от того, когда MatchUser ассоциация был создан, а не когда User сам был создан?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Вы не хотите использовать has_and_belongs_to_many в первую очередь.has_and_belongs_to_many отношения безголовы - модели объединения нет.Единственные столбцы, которые когда-либо использовались в соединительной таблице, - это два внешних ключа.Даже если вы добавили столбец created_at в таблицу соединений, нет способа получить к нему доступ или использовать его для упорядочения записей.И AR все равно не установит временные метки.

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

Вы хотите использовать has_many through:, который использует модель для объединения двух записей:

class User < ApplicationRecord
  has_many :user_matches
  has_many :matches, through: :user_matches
end

class Match < ApplicationRecord
  has_many :user_matches
  has_many :users, through: :user_matches
end

class UserMatch < ApplicationRecord
  belongs_to :user
  belongs_to :match
end

Затем вы можете заказать ассоциацию:

match.users.order("user_matches.created_at DESC")
0 голосов
/ 02 декабря 2018
match.users.first

вернет первого пользователя по: id.

Если вы хотите, чтобы он был заказан create_at, вы должны сделать что-то вроде

user_id = matches_users.where(match_id: match.id).first.user_id
user.find(user_id)

Надеюсь, что это то, что вы естьглядя на.

...