Вы определили внешний ключ person_id
как int
, но вы пытаетесь получить его для хранения bigint
uuid для ассоциации в поле int
.Попробуйте вместо этого использовать bigint для person_id
в вашей схеме.
Предполагается, что вы установили 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) для вашего здравого смысла переименовать в person_uuid
, как в примере выше.Если вам нужна вся логика, это решение должно работать нормально (учитывая, что столбец uuid
является уникальным индексом в Person).Вы также можете определить это как правильное отношение внешнего ключа:
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
как уникальные индексы, если они не являются первичными ключами.(unique: true
в определении столбца)