通过 created_at 在关联而不是对象上对 HABTM 关联进行排序
Order HABTM associations by created_at on the association instead of the object
我有一个 Match
和 User
模型,它们之间有一个 has_and_belongs_to_many。
如何根据 MatchUser
关联 的创建时间而不是 [=] 的时间检索 match.users.first
和 match.users.second
12=] 本身是创建的?
match.users.first
将 return 第一个用户 :id.
如果你想按 created_at 排序,那么你必须做类似
的事情
user_id = matches_users.where(match_id: match.id).first.user_id
user.find(user_id)
希望这就是您所看到的。
您首先不想使用 has_and_belongs_to_many
。 has_and_belongs_to_many
关系是无头的——没有连接模型。在联接 table 中使用过的唯一列是两个外键。即使您将 created_at
列添加到联接 table 中,也无法访问它或使用它来对记录进行排序。而且 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")
我有一个 Match
和 User
模型,它们之间有一个 has_and_belongs_to_many。
如何根据 MatchUser
关联 的创建时间而不是 [=] 的时间检索 match.users.first
和 match.users.second
12=] 本身是创建的?
match.users.first
将 return 第一个用户 :id.
如果你想按 created_at 排序,那么你必须做类似
的事情user_id = matches_users.where(match_id: match.id).first.user_id
user.find(user_id)
希望这就是您所看到的。
您首先不想使用 has_and_belongs_to_many
。 has_and_belongs_to_many
关系是无头的——没有连接模型。在联接 table 中使用过的唯一列是两个外键。即使您将 created_at
列添加到联接 table 中,也无法访问它或使用它来对记录进行排序。而且 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")