外键不指向rails和postgres中的主键?

时间:2016-10-27 09:34:11

标签: ruby-on-rails database postgresql activerecord

我正在使用Rails和传统的postgres数据库,这意味着没有迁移。架构是单独定义的。

我有两个表:notificationnotification_typenotification_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来尊重我的数据库中的外键关系,而不是总是使用主键?

1 个答案:

答案 0 :(得分:3)

只是做:

belongs_to :notification_type, foreign_key: 'notification_type', primary_key: 'code'

primary_key默认为id,但您可以使用任何您想要的内容。

您希望为has_many :notifications关联指定相同的选项 - has_many完全不知道它与关联的belongs_to,因此它需要知道您是否使用非 - 标准键。