【问题标题】: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
    

    【讨论】:

    • 感谢您的回答@SRack,我终于明白我的错误了
    【解决方案2】:

    current_user 不返回 ActiveRecord 关系,它只返回用户,因此您不能将其与范围链接在一起(我假设您收到的错误消息是 undefined method 'my_group' for #&lt;User&gt;?)。将范围添加到您的 Group 类并通过您的 groups has_many 关系使用它,例如 current_user.groups.my_group

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 2013-01-19
      相关资源
      最近更新 更多