2015-10-30 70 views
4

我想要的是:对于给定的外键名称和模型类,我可以获得关联(知道可以解析哪种模型)。从外键获取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. 我可以建立一个地图这个外键,得到联想

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

更新:我真的需要

我执行使用auditaudit log视图。然而,当我试图输出审计日志,我可以得到的是这样的:

supplier_id: changed from '1' to '0' 

我希望与供应商的实际名称来代替数字,因此,我认为如果给supplier_id,我应该能够得到Supplier模型。

另外,因为我用这样的:

belongs_to :reporter, class_name: 'User' 

我因此不能简单地猜测从给定键的类名。

+0

嘿,你的实际需求是什么?,这个解释有点混乱。请详细说明。 –

+0

@Bharatsoni用例更新:) – songyy

+0

@songyy,你找到解决方案吗? – Fivell

回答

3

您正在寻找reflect_on_association

Product.reflect_on_association(:category)

编辑:不要使用反映*在这里。

TL;博士:Log类名称,并使用.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

+2

感谢您的信息。但似乎我只能调用'Product.reflect_on_association(:category)';调用'Product.reflect_on_association(:category_id)'会返回一个'nil' – songyy

+0

你是对的。修复它的答案。如果你只有包含'_id'部分的字符串,你可以使用'.sub!(/ _ id $ /,'')'将其删除。 –

+1

嗯,但有时外国人可能不是'[association_name] _id',因为我实际上可以设置外键:'has_many:下属,class_name:“Employee”, foreign_key:“manager_id”' – songyy