如何找出模型的所有关联?

How to find out all the association of a model?

假设我有以下型号

class User < ApplicationRecord
  devise :database_authenticable,:registerable
         :recoverable, :trackable, :validatable, :rememberable
  
  belongs_to :loginable, polymorphic: true
end

class Customer < ApplicationRecord
  has_one :user, as: :loginable, dependent: :destroy
end

有很多与Customer相似的模型。我如何从用户模型本身找出所有这些模型?我试过了User.reflections。但它不显示与客户的关联。有没有一种方法说 User.relationships 会列出 Customer 和所有与 Customer 相似的模型?如果不是,我如何才能找到这样的模型?

如果问题是查找 User 可以属于的所有 类,那么这实际上就是代码中的每个模型。这就是多态的作用。

如果问题是User目前属于什么型号,那就用数据库搞清楚。

User.distinct.pluck(:loginable_type)

如果问题是什么模型定义了 has_one :user 关系,那么您必须查看所有模型并使用您已经找到的 .reflections 方法从他们的角度提出问题。

belongs_to :loginable, polymorphic: true 在用户模型中生成 loginable_idloginable_type(包含 class 名称)字段。链接模型不一定要有反向关系,所以你只能仔细检查代码才能找到这样的模型。

此外,生产数据可能包含指向应用程序中根本不存在的模型的链接(已从应用程序中删除,但未从数据中删除,获取这些会导致错误),从您的生产中获取 User.distinct.pluck(:loginable_type)使用过的列表(但由于上述 - 列表不保证完整)。