我有一个人物模型:
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.
任何帮助将不胜感激。
答案 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
)