В моем приложении rails есть модель User и Campaign. Кампания has_many
пользователей и кампания пользователей has_one
.
Я хочу заказать пользователей в кампании по дате, когда они были добавлены в нее.
Для этого я создал сквозную таблицу с именем CampaignUser. Я думал, что смогу сделать заказ по столбцу created_at
в этой таблице, но я не мог найти простой способ сделать это. Смотрите классы ниже:
class Campaign < ApplicationRecord
has_many :campaign_users
has_many :users, through: :campaign_users
end
class User < ApplicationRecord
has_one :campaign, through: :campaign_users, dependent: :destroy
end
class CampaignUser < ApplicationRecord
belongs_to :campaign
belongs_to :user
end
В идеале я хотел бы написать такую строку в своем классе Campaign:
has_many :users, through: campaign_users, -> { order(created_at: :desc) }
Где created_at
относится к campaign_users
, а не к users
. Есть способ сделать это?
Я мог бы просто написать метод в Campaign, чтобы заказывать пользователей вручную, но тогда я должен был бы убедиться, что вместо этого я вызываю этот метод везде. Кажется, должен быть более легкий путь.
Edit:
Добавление области действия для пользователя, , как предлагается в других ответах в этом случае более проблематично. Я хочу упорядочить пользователей по свойству сквозной таблицы, а не по свойству самого пользователя. Можно ли написать следующую строку, заменив email
на campaign_users.created_at
или что-то подобное?
has_many :users, -> { order(email: :desc) }, :through => :campaign_users