使用 join table 范围关联元素

Scope associated element with join table

我正在尝试确定我的主要用户组的范围。该组用一只猫表示:即 2.

所以我想用

这样的范围来做这件事
class User < ApplicationRecord
  has_many :users_group, dependent: :destroy
  has_many :groups, through: :users_group

  scope :my_group, -> { self.joins(:groups).where('groups.cat = 2').limit(1) } 
end

但是下面的命令不起作用:

current_user.my_group

你能指导我实现它的好方法吗?

current_user 不是 return ActiveRecord 关系,它只是 return 用户,所以你不能将它与范围链接在一起(我假设错误您收到的消息是 undefined method 'my_group' for #<User>?)。将范围添加到您的 Group class 并通过您的 groups has_many 关系使用它,例如 current_user.groups.my_group

正如马里奥所说,范围适用于集合,而不是实例。

如果您想保留 User 模型中的方法,您可以使用以下方法:

user.rb

def my_group
  groups.find_by_cat(2)
end

使用 find_by 将 return 一个组,而不是使用 where / limit。如果找不到该组,它将 return nil.

我建议使用作用域 return 单个实例有点反模式,使用这种方法会更好,或者将以下方法放入 Group 并调用 current_user.groups.my_group - 虽然名字 my_group 听起来有点不合适。为了完整起见,这里不管:

group.rb

def my_group
  find_by_cat(2)
end