как добавить уникальный столбец таблицы в ruby ​​на рельсах - PullRequest
8 голосов
/ 14 мая 2010

У меня есть таблица с некоторыми столбцами, теперь мне нужно изменить один столбец, чтобы сделать его уникальным (без повторяющихся значений), как я могу сделать это в ruby ​​на рельсах?

Ответы [ 5 ]

7 голосов
/ 14 мая 2010

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

class MyModel < ActiveRecord::Base
   validates_uniqueness_of :my_column_name
end
4 голосов
/ 09 марта 2015
class MyModel < ActiveRecord::Base
  validates_uniqueness_of :my_column_name
end

предложенное выше может сломаться, если вы используете Unicorn на нескольких династиях Heroku, у каждого из которых несколько веб-процессов и т. Д.

так что лучший способ сделать это будет

class AddEmailIndexToUser
  def change
    # If you already have non-unique index on email, you will need
    # to remove it before you're able to add the unique index.
    add_index :users, :email, unique: true
  end
end

https://robots.thoughtbot.com/the-perils-of-uniqueness-validations

или вы можете использовать raw sql в миграции, чтобы сделать это.

execute <<-SQL
  ALTER TABLE Persons
  ADD UNIQUE (P_Id)
SQL
3 голосов
/ 14 мая 2010

Это код прямо из моего рабочего проекта:

add_index( :tickets, [:to_email, :body_hash, :from_email] , :unique => true, :limit => 255)

Обратите внимание, что функциональность limit требуется только в том случае, если вы используете уникальные текстовые поля (а не строки), хотя они еще не реализованы в рельсах (я полагаю, в 3.0) Вы можете обойти это ограничение, используя плагин mysql_index_length http://github.com/eparreno/mysql_index_length/

add_index( :table_name, [:column_name, :second_column_name, :third_column_name] , :unique => true, :limit => 255)

В этом примере создается уникальный индекс для трех столбцов, хотя вы можете использовать его для одного столбца, если хотите.

Ссылка на проект на GitHub: http://github.com/thinkbohemian/WhySpam/blob/master/db/migrate/20091223193335_add_unique_index.rb

0 голосов
/ 14 мая 2010

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

def self.up
    change_column :<table name>, :<attribute name>, :<data type>, :unique => true
end
0 голосов
/ 14 мая 2010
 counter = 0
 Model.all.each {|m| m.some_value = counter; m.save; counter += 1;}

:)

, а затем добавьте проверку как @j. ответил

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...