我想要的是:对于给定的外键名称和模型类,我可以获得关联(知道它可以解析到哪个模型)。
例如:
# model: product.rb
class Product < ActiveRecord::Base
belongs_to :category
end
# resolution:
association = Product.get_association('category_id')
所以我需要这个get_association
函数。
我现在所知道的:
- 从Product.reflections我可以获得反射/关联的列表
- 仔细想想,我可以拿到外键
- 我可以为这个外键建立一个映射,以获得关联
但是,我想问一下,是否有一个简单的方法可以直接调用?
更新:我实际需要的
我正在使用audit实现audit log
视图。然而,当我试图输出审计日志时,我能得到的是这样的东西:
supplier_id: changed from '1' to '0'
我想用供应商的实际名称替换这些数字,因此我相信如果给定supplier_id
,我应该能够得到Supplier
型号。
另外,因为我以前喜欢:
belongs_to :reporter, class_name: 'User'
因此,我不能简单地根据给定的键来猜测类名。
您正在寻找reflect_on_association
Product.reflect_on_association(:category)
编辑:此处不要使用反射*。
tl;dr:记录类名并使用.find
如果你的模型看起来像
class Employee
belongs_to :manager, foreign_key: :manager_id
end
class Manager
has_many :subordinates, foreign_key: :manager_id, class_name: 'Employee'
end
日志文件显示类似的内容:manager_id: changed from '1' to '2'
,已经更改的模型将是Employee
,因为它有列manager_id
。但是,从问题中的示例日志中无法了解这一点,因为由于不止一个模型可以具有列manager_id
,因此不可能得到明确的答案。但在这个简单的例子中,我们知道关联的模型是Manager
,日志中的数字可以替换为名称:Manager.find(1)
、Manager.find(2)
。这里不需要反射魔法。
想想这个例子:
class Employee
belongs_to :manager, foreign_key: :department_id, class_name: 'Manager'
end
class Responsibility
belongs_to :manager, foreign_key: :organizer_id, class_name: 'Manager'
belongs_to :department, foreign_key: :department_id, class_name: 'Department'
end
class Manager
has_many :subordinates, foreign_key: :organizer_id, class_name: 'Employee'
has_many :obligations, foreign_key: :organizer_id, class_name: 'Responsibility'
end
class Department
has_many :obligations, foreign_key: :department_id, class_name: 'Responsibility'
end
如果你的日志只包含department_id: changed from '1' to '2'
,你就不知道你的公司到底发生了什么变化。
要解决此问题,您必须记录关联模型的类名(而不是已更改的模型的类名)。如果您的类名在这里不需要任何反射,那么它将只是一个.find
,就像第一个简单情况一样。