考虑3个型号,用户,组,&GroupMembership
class User < ApplicationRecord
has_many :group_memberships
has_many :groups, through: :group_memberships
end
class Group < ApplicationRecord
has_many :group_memberships
has_many :users, through: :group_memberships
end
class GroupMembership < ApplicationRecord
belongs_to :user
belongs_to :group
scope :current, -> { where(active_at: [nil, (..Time.current)], expires_at: [nil, (Time.current..)]) }
end
User或Group没有什么值得注意的,但是GroupMembership有两个DateTime列来控制成员资格是否为当前:active_at和expires_at。我的逻辑是,在给定的时间点,只要active_at <= point_in_time
我不想在GroupMembership上设置默认作用域,但是我希望has_many关联只包含当前的连接。
我已经尝试添加:当前范围(这是为GroupMembership定义的)到组成员资格中的belongs_to,我已经尝试添加:当前范围到组和用户的has_many:through,每种方法都会导致错误,当试图找到用户的组和组的用户。
如何使这些关系按预期工作?
对于这个问题,我最初在我的模型中省略了has_many:group_memberships,在添加之后,这个问题几乎自己回答了——存在于GroupMembership模型上的作用域属于User和Group模型的has_many:group_memberships。
对此不确定,但您可以尝试以下操作。在用户或组模型中,您可以创建一个新函数来执行查询,然后只检索它。我不是100%确定语法,但它是这样的:
class User < ApplicationRecord
has_many :group_memberships
has_many :groups, through: :group_memberships
def self.current
self.joins(:group_memberships).where(active_at: [nil, (..Time.current)], expires_at: [nil, (Time.current..)])
end
end
然后在你的控制器中你可以这样做:
User.current
将范围添加到User和Group模型中的has_many:group_memberships中,这正是所要求的。
class User < ApplicationRecord
has_many :group_memberships, -> { current }
has_many :groups, through: :group_memberships
end
class Group < ApplicationRecord
has_many :group_memberships, -> { current }
has_many :users, through: :group_memberships
end