【问题标题】:Scope associated element with join table范围关联元素与连接表
【发布时间】:2017-11-17 14:37:01
【问题描述】:
我正在尝试确定我的用户的主要组。这个组用一只猫来标注:它是 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
你能引导我找到实现它的好方法吗?
【问题讨论】:
标签:
ruby-on-rails
ruby
scope
activemodel
【解决方案1】:
正如马里奥所说,作用域适用于集合,而不是实例。
如果您想将该方法保留在 User 模型中,您可以使用以下内容:
user.rb
def my_group
groups.find_by_cat(2)
end
使用find_by 将返回一个组,而不是使用where / limit。如果未找到该组,它将返回nil。
我建议使用作用域返回单个实例有点反模式,使用这种方法会更好地实现,或者将以下方法放入Group 并调用current_user.groups.my_group - 虽然my_group 这个名字听起来有点不合适。为了完整起见,这里不管:
group.rb
def my_group
find_by_cat(2)
end
【解决方案2】:
current_user 不返回 ActiveRecord 关系,它只返回用户,因此您不能将其与范围链接在一起(我假设您收到的错误消息是 undefined method 'my_group' for #<User>?)。将范围添加到您的 Group 类并通过您的 groups has_many 关系使用它,例如
current_user.groups.my_group