我的用户模型如下:
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”
以下是如何正确设置自引用关联的示例,并且命名不那么混乱:
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
列。
您收到该错误是因为您尚未定义
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