从外键获取rails关联



我想要的是:对于给定的外键名称和模型类,我可以获得关联(知道它可以解析到哪个模型)。

例如:

# model: product.rb
class Product < ActiveRecord::Base
  belongs_to :category
end
# resolution:
association = Product.get_association('category_id')

所以我需要这个get_association函数。

我现在所知道的:

  1. 从Product.reflections我可以获得反射/关联的列表
  2. 仔细想想,我可以拿到外键
  3. 我可以为这个外键建立一个映射,以获得关联

但是,我想问一下,是否有一个简单的方法可以直接调用?

更新:我实际需要的

我正在使用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,就像第一个简单情况一样。

相关内容

  • 没有找到相关文章

最新更新