我想要的是:对于给定的外键名称和模型类,我可以获得关联(知道可以解析哪个模型)。
例如:
# model: product.rb
class Product < ActiveRecord::Base
belongs_to :category
end
# resolution:
association = Product.get_association('category_id')
所以我需要这个get_association
函数。
我现在所知道的:
但是,我想问一下我是否可以直接调用一个简单的方法?
更新:我真正需要的是什么
我正在使用audit实施audit log
视图。但是,当我尝试输出审核日志时,我能得到的是这样的:
supplier_id: changed from '1' to '0'
我想将这些数字替换为供应商的实际名称,因此我相信如果给定supplier_id
,我应该能够获得Supplier
模型。
另外,因为我用过:
belongs_to :reporter, class_name: 'User'
因此,我不能简单地从给定的密钥中猜出类名。
答案 0 :(得分:3)
Product.reflect_on_association(:category)
编辑:请勿在此处使用reflect *。
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
一样。