我正在使用Rails和传统的postgres数据库,这意味着没有迁移。架构是单独定义的。
我有两个表:notification
和notification_type
。 notification_type
表格包含ID
(主键)和code
列。 notification
表格的notitification_type
列中包含外键,notificiation_type
表的code
列。
class Notification < ActiveRecord::Base
...
belongs_to :notification_type, foreign_key: 'notification_type'
...
NotificationType:
class NotificationType < ActiveRecord::Base
has_many :notifications
end
当我在通知模型上调用create时,它会给我一个外键错误,因为它试图使用notification_type的ID列创建,而不是代码列。
ActiveRecord :: InvalidForeignKey:PG :: ForeignKeyViolation:错误:在表“通知”上插入或更新违反外键约束“notification_notification_type_fkey” 详细信息:表“notification_type”中不存在密钥(notification_type)=(18)。
其中18是ID,但是我需要它来使用代码,类似于1或2.我看到了association_foreign_key
值,但它似乎只适用于{{1}关联。
psql,仅用于关闭:
外键约束: “notification_notification_type_fkey”FOREIGN KEY(notification_type)REFERENCES notification_type(code)
基本上,我如何让rails来尊重我的数据库中的外键关系,而不是总是使用主键?
答案 0 :(得分:3)
只是做:
belongs_to :notification_type, foreign_key: 'notification_type', primary_key: 'code'
primary_key
默认为id
,但您可以使用任何您想要的内容。
您希望为has_many :notifications
关联指定相同的选项 - has_many完全不知道它与关联的belongs_to,因此它需要知道您是否使用非 - 标准键。