Используя Rails, как я могу установить мой первичный ключ, чтобы он не был столбцом целого типа? - PullRequest
82 голосов
/ 29 июля 2009

Я использую Rails-миграции для управления схемой базы данных и создаю простую таблицу, в которой я хотел бы использовать нецелое значение в качестве первичного ключа (в частности, строку). Чтобы абстрагироваться от моей проблемы, скажем, есть таблица employees, где сотрудники идентифицируются буквенно-цифровой строкой, например "134SNW".

Я пытался создать таблицу в миграции следующим образом:

create_table :employees, {:primary_key => :emp_id} do |t|
    t.string :emp_id
    t.string :first_name
    t.string :last_name
end

То, что это дает мне, - это то, что кажется, что он полностью проигнорировал строку t.string :emp_id и пошел вперед и сделал его целочисленным столбцом. Есть ли другой способ заставить rails генерировать для меня ограничение PRIMARY_KEY (я использую PostgreSQL), без необходимости писать SQL в вызове execute?

ПРИМЕЧАНИЕ : я знаю, что не лучше использовать строковые столбцы в качестве первичных ключей, поэтому, пожалуйста, не отвечайте, просто добавив целочисленный первичный ключ. Я могу добавить один в любом случае, но этот вопрос остается в силе.

Ответы [ 14 ]

2 голосов
/ 29 июля 2009

вы должны использовать опцию: id => false

create_table :employees, :id => false, :primary_key => :emp_id do |t|
    t.string :emp_id
    t.string :first_name
    t.string :last_name
end
1 голос
/ 29 июля 2015

Добавление индекса работает для меня, я использую MySql, кстати.

create_table :cards, {:id => false} do |t|
    t.string :id, :limit => 36
    t.string :name
    t.string :details
    t.datetime :created_date
    t.datetime :modified_date
end
add_index :cards, :id, :unique => true
1 голос
/ 18 июня 2013

Я знаю, что это старая нить, с которой я наткнулся ... но я шокирован тем, что никто не упомянул DataMapper.

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

Ruby Object Mapper (DataMapper 2) также содержит много обещаний и основывается на принципах AREL!

1 голос
/ 08 июня 2012

Как насчет этого решения,

Внутри модели Employee, почему мы не можем добавить код, который будет проверять уникальность в столбце, например: Предположим, что Employee is Model, если у вас есть EmpId, который является строкой, для которого мы можем добавить ": uniqueness => true " для EmpId

    class Employee < ActiveRecord::Base
      validates :EmpId , :uniqueness => true
    end

Я не уверен, что это решение, но у меня это сработало.

...