主键和外键超出范围

时间:2018-08-27 04:32:15

标签: ruby-on-rails postgresql foreign-keys rails-activerecord

我有一个人物模型:

id: int, uuid:bigint

和博客文章:

id: int, uuid:bigint, person_id: int

我希望blogpost.person返回人员模型的uuid,而不是其id。

我尝试过(人班):

has_many :blogposts, dependent: :delete_all, inverse_of: :deck, primary_key: :uuid

但是我得到:

ActiveModel::RangeError: 1534420711008 is out of range for ActiveModel::Type::Integer with limit 4 bytes.

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您已将外键person_id定义为int,但是您试图使其存储在关联bigint中的int uuid领域。尝试在您的架构中为person_id使用bigint。

这是假设您已将uuid设置为Person的主键。如果您还没有:https://edgeguides.rubyonrails.org/active_record_basics.html#overriding-the-naming-conventions

修改

如您所述,您不想将uuid用作人员的主键。外键通常引用另一个表中的主键,但也可以引用唯一的索引列。

首先,按照惯例,blogpost.person不应返回uuid对象,而应返回Person对象。因此,简单的方法是添加一个范围或方法:

class Blogpost < ApplicationModel

  def person
    Person.find_by_uuid(person_uuid)
  end

end

第二,如果blogpost.person_id字段包含uuid,则它(1)应该是bigint,而不是int,并且(2)重命名为{ {1}},如上例所示。如果这就是您所需要的全部逻辑,则该解决方案应该可以正常工作(假设person_uuid列是Person中的唯一索引)。您还可以将其定义为适当的外键关系:

uuid

但是,请确保将class Blogpost < ApplicationModel belongs_to :person, foreign_key: :person_uuid end class Person < ApplicationModel has_many :blogposts, foreign_key: :person_uuid, inverse_of: :person, primary_key: :uuid end person_uuid定义为迁移中的唯一索引(如果它们不是主键)。 (列定义中的uuid