我怎样才能用rails进行自引用的逆操作

问题描述 投票:0回答:2

我的用户模型如下:

  has_many :users, class_name: 'User'
  belongs_to :master_user, class_name: 'User', optional: true, inverse_of: :users

我想找到:

User.first.master_user 就可以了

MasterUser.users 但收到错误:“NameError:未初始化常量 MasterUser”

ruby-on-rails
2个回答
1
投票

以下是如何正确设置自引用关联的示例,并且命名不那么混乱:

class User < ApplicationRecord
  belongs_to :manager
    class_name: 'User', # requied here since it cannot be derided from the name
    optional: true,
    inverse_of: :subordinates
  has_many :subordinates,
    class_name: 'User',  # requied here since it cannot be derided from the name
    foreign_key: :manager_id, # what column on the users table should we join
    inverse_of: :manager
end

这里的“管理者”并不是一个单独的类。虽然您可以使用单表继承来达到此目的,但您可能应该首先弄清楚基础知识。即使你确实有一个

MasterUser
类,你也会得到
NoMethodError
,因为你在类上调用
.users
而不是类的实例 - 这永远不会起作用,并且是一个非常常见的初学者错误。

请注意,严格来说,这实际上可以在没有

inverse_of:
选项的情况下工作,该选项实际上只是用于显式设置内存中的双向绑定

所以在你的情况下它应该看起来像:

class User < ApplicationRecord
  # class_name isn't required since it can be derided from the name
  has_many :users, 
    foreign_key: :master_user_id,
    inverse_of: :master_user
  belongs_to :master_user, 
    class_name: 'User', # requied here since it cannot be derided from the name
    optional: true, 
    inverse_of: :users
end

请注意,users 表必须有一个

master_user_id
列。


0
投票

您收到该错误是因为您尚未定义

MasterUser
模型。我猜您只有问题中描述的
User
模型。如果你想找到属于“master_user”的用户,那么你需要先找到一个“master_user”,然后请求它的用户。它看起来像这样:

user_with_a_master = User.where.not(master_user_id: nil).first
master             = user_with_a_master.master_user
master_users       = master.users
© www.soinside.com 2019 - 2024. All rights reserved.