从外键获取rails关联?

时间:2015-10-30 05:01:02

标签: ruby-on-rails ruby reflection

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

例如:

# model: product.rb
class Product < ActiveRecord::Base
  belongs_to :category
end

# resolution:
association = Product.get_association('category_id')

所以我需要这个get_association函数。

我现在所知道的:

    来自Product.reflections的
  1. 我可以获得一个反思/关联列表
  2. 进行一次反思,我可以获得外键
  3. 我可以为这个外键构建一个地图,以获得关联
  4. 但是,我想问一下我是否可以直接调用一个简单的方法?

    更新:我真正需要的是什么

    我正在使用audit实施audit log视图。但是,当我尝试输出审核日志时,我能得到的是这样的:

    supplier_id: changed from '1' to '0'
    

    我想将这些数字替换为供应商的实际名称,因此我相信如果给定supplier_id,我应该能够获得Supplier模型。

    另外,因为我用过:

    belongs_to :reporter, class_name: 'User'
    

    因此,我不能简单地从给定的密钥中猜出类名。

1 个答案:

答案 0 :(得分:3)

您正在寻找reflect_on_association

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一样。