Использование ассоциации has_one для модели с зашифрованным первичным ключом

У меня есть модели Address и ZipCode. Address модель имеет encrypted_post_code поле, ZipCode имеет code поле. Я хотел бы связать Address записей и ZipCode записей с помощью ассоциации has_one, используя указанные поля. В настоящее время мне нужно использовать такие функции ActiveRecords, как включение, предварительная загрузка, нетерпеливая_загрузка и т. д.

К сожалению, все строковые поля адресных записей зашифрованы (это требование заказчика). Я не могу использовать has_one :zip_code, primary_key: :post_code, foreign_key: :code, потому что у меня нет поля post_code в таблице адресов, оно содержит только поле зашифрованного_post_code.

Посоветуйте, как решить эту проблему.


person Sergei Struk    schedule 29.09.2015    source источник


Ответы (1)


Я не думаю, что ваш клиент на самом деле понимает преимущества шифрования. Но это не имеет значения, потому что ваша база данных должна создавать ассоциации по id, а не по зашифрованному почтовому индексу.

Таким образом, ваша таблица почтовых индексов может иметь столбцы id, encrypted_post_code, а затем адрес просто имеет поле postcode_id и делает соединение таким образом. Таким образом, вы полностью избегаете работы с зашифрованными почтовыми индексами, пока вам не понадобится выяснить, что такое настоящий почтовый индекс, после чего вы ищете его через ассоциацию и расшифровываете.

person Max Williams    schedule 29.09.2015
comment
Спасибо! Вы правы, это будет работать, но есть ли способ не менять схемы таблиц? Это будет довольно больно. - person Sergei Struk; 29.09.2015
comment
Просто измените его с помощью миграции, лучше потратить немного времени на его получение прямо сейчас, чем вечно бороться с чем-то странным и неинтуитивным. - person Max Williams; 29.09.2015