Первичный и внешний ключи вне диапазона - PullRequest
0 голосов
/ 27 августа 2018

У меня есть модель человека:

id: int, uuid:bigint

и запись в блоге:

id: int, uuid:bigint, person_id: int

Я хочу, чтобы blogpost.person вернул uuid модели человека, а не их идентификатор.

Я пытался (индивидуальный класс):

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 голосов
/ 27 августа 2018

Вы определили внешний ключ 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 в определении столбца)

...