从Rails的关联中获取外键字段

17

我想知道在Rails中给定模型的表标题对应的字段名。

使用查询模型来显示标题。

 
   

query.columns.map{|q| q.caption}
    => ["Tracker", "Status", "Priority", "Subject", "Assignee", "Target version", "Due date", "% Done"]

 

列名称对应于标题。

 
   

query.columns.map{|q| q.name}
    => [:tracker, :status, :priority, :subject, :assigned_to, :fixed_version, :due_date, :done_ratio]

 

我的模型看起来像这样

 
   

Issue.columns.map{|q| q.name}
    => ["id", "tracker_id", "project_id", "subject", "description", "due_date", "category_id", "status_id", "assigned_to_id", "priority_id", "fixed_version_id", "author_id",  "created_on", "updated_on", "start_date", "done_ratio", "estimated_hours", "parent_id"]

 

我想要从上面的信息中获取对应于标题的字段名(数据库字段名)。

模型中的示例关联

belongs_to :assigned_to, :class_name => 'Principal', :foreign_key => 'assigned_to_id'

因此,针对上述关联,我想知道外键。

对于assigned_to,我想要的是'assigned_to_id'

3个回答

27

reflections哈希表保存这种信息:

Issue.reflections['assigned_to'].foreign_key

您还可以获取其他信息,例如类 (.active_record) 或关联类型 (.macro)。在 Rails 4.2 之前,此哈希表的键是符号而不是字符串。


这对我有用...Issue.reflections[:assigned_to].options[:foreign_key]..谢谢 - Dipendra Singh
只有在关系使用活动记录模型定义,并且如果与Rails命名外键字段的约定有任何偏差,则还应在活动记录模型中指定,否则它只返回按约定而非实际字段名命名的字段名。 - Richa Sinha

1

1
注意:这将仅返回附加到传递给关联助手的选项哈希的自定义外键。因此,在自动设置外键的标准情况下,它将无法工作。顺便说一句,Frederick的解决方案在Rails 4.2中仍然有效。 - MhdSyrwan
1
确实!谢谢你的指出!不过,为了使Frederick的解决方案在Rails 4.2中生效,关联名称必须以字符串而不是符号的形式传递。 - Artur INTECH

0
我在这里发布这篇文章,以便帮助其他人。我试图从关联扩展中获取proxy_association的外键。
您可以通过简单地使用proxy_associtation.reflection来获取reflection
然后,使用@Frederick Cheung上面的方法,您可以这样获取外键:
reflection = proxy_association.reflection
reflection.foreign_key

你也可以用同样的方式获取class_name

reflection = proxy_association.reflection
reflection.class_name

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接