加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 从外键获取rails关联?

发布时间:2020-12-17 02:25:07 所属栏目:百科 来源:网络整理
导读:我想要的是:对于给定的外键名称和模型类,我可以得到关联(知道可以解析哪个模型). 例如: # model: product.rbclass Product ActiveRecord::Base belongs_to :categoryend# resolution:association = Product.get_association('category_id') 所以我需要这个
我想要的是:对于给定的外键名称和模型类,我可以得到关联(知道可以解析哪个模型).

例如:

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

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

所以我需要这个get_association函数.

我现在知道的:

>从Product.reflections我可以得到一个反射/关联列表
>对于一次反射,我可以得到外键
>我可以为这个外键构建一个地图,以获得关联

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

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

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

supplier_id: changed from '1' to '0'

我想用供应商的实际名称替换数字,因此我相信如果给出supplier_id,我应该能够获得供应商模型.

另外,因为我用过:

belongs_to :reporter,class_name: 'User'

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

解决方法

您正在寻找 reflect_on_association

Product.reflect_on_association(:类)

编辑:不要在这里使用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

并且logfile表示如下:manager_id:从’1’更改为’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,class_name: 'Department'
end

class Manager
  has_many :subordinates,class_name: 'Employee'
  has_many :obligations,class_name: 'Responsibility'
end

class Department
  has_many :obligations,class_name: 'Responsibility'
end

如果您的日志只包含department_id:从“1”更改为“2”,您无法知道公司中的确切更改内容.

要解决此问题,您必须记录关联模型的类名(而不是已更改的模型的类名).如果您有类名,那么这里不需要任何反射,它就像第一个简单的情况一样.find.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读