многоколонные первичные ключи в рельсах - PullRequest
6 голосов
/ 20 ноября 2011

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

Учитывая, что у меня есть три таблицы:

authors
  author_name,
  author_letter,
  author_nr1,
  author_nr2
  ...

titles
  titel_nr,
  titel_name,
  ...

author_titles
  titel_nr,
  author_letter,
  author_nr1,
  author_nr2

«Первичный ключ» авторов состоит из здесь author_letter, author_nr1, author_nr2.

Так нужен ли мне здесь многоколонный первичный ключ для работы ассоциаций рельсов? Или я иду в неправильном направлении здесь?

Ответы [ 3 ]

11 голосов
/ 20 ноября 2011

Нет.Первичный ключ - это (как у rails по умолчанию) идентификатор записи.

Кроме того, вы можете установить уникальные ключи, например

    add_index :users, [:merchant_id, :email], unique: true
    add_index :users, [:merchant_id, :login], unique: true

.Чтобы поймать уникальность в Rails, вам нужно написать в свою модель:

  validates_uniqueness_of :email,    scope: :merchant_id
  validates_uniqueness_of :login,    scope: :merchant_id
0 голосов
/ 15 февраля 2012

Как многие люди говорили: «Если ты будешь сражаться с Рельсами, это нанесет ответный удар». Действительно старайтесь избегать таких ситуаций, это боль с рельсов, если у вас нет чистой модели данных.

0 голосов
/ 20 ноября 2011

Существует гем под названием Combo_primary_keys , который позволит создать первичный ключ, используя несколько столбцов.

Так что, да, вы можете использовать многоколонный первичный ключ.Но если вы можете изменить модель данных (что не всегда так), я бы предложил добавить идентификатор столбца к каждой таблице, так как это облегчит вашу жизнь (а также значительно повысит производительность).

[РЕДАКТИРОВАТЬ]

Ваше определение класса с Composite_primary_keys будет выглядеть так

class Author
  set_primary_keys :author_letter, :author_nr1, :author_nr2
  has_many :titles, :through => :author_title
end

class Title
  set_primary_key :title_nr
end

class AuthorTitle
  belongs_to :title, :foreign_key => :title_nr
  belongs_to :authori, :foreign_key => [:author_letter, :author_nr1, :author_nr2]
end

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

...