В rails, можете ли вы иметь связь между двумя моделями, где primary_key и foreign_key имеют разные типы данных? - PullRequest
1 голос
/ 21 января 2011

это следующий кошерный?

schema.rb
  users
    id:int (autoincr.)
    uid:string <----------------
    ...

  fb_friends
    id:int (autoincr.)
    uid:int <-------------------
    friend_uid:int
    ...

user.rb
   has_many :fb_friends, :primary_key => "uid", :foreign_key => "uid"

Обратите внимание, что ключи, связывающие "пользователя" и их "fb_friends" вместе, имеют разные типы данных (string и int). В идеальном мире я бы, вероятно, не сделал бы этого, но, учитывая текущую архитектуру системы, это, кажется, решение, которое будет работать лучше всего.

Но нормально ли это делать / будет ли работать без snafoos?

Ответы [ 2 ]

2 голосов
/ 21 января 2011

Это зависит от используемого вами механизма БД, например, для mysql =>

Соответствующие столбцы в иностранном ключ и ссылочный ключ должен иметь аналогичные внутренние типы данных внутри InnoDB, чтобы их можно было сравнить без преобразования типа. Размер и знак целочисленных типов должен быть так же. Необходима длина типов строк не быть таким же. Для недвоичных (символьные) строковые столбцы, набор символов и сопоставление должны быть то же самое.

Подробнее здесь , В любом случае, я не скажу, что будет хорошей практикой сравнивать поля разных типов: (.

Надеюсь, это поможет вам!

1 голос
/ 21 января 2011

Не уверен, что это работает, но я бы не рекомендовал его, если у вас есть возможность изменить егоИзменить тип столбца в миграции на Rails очень просто:

change_column :users, :uuid, :integer
...