Question

I have a simple MySQL table with one column: name.

I would like to define a unique constraint on this column.

I can do:

class MyModel < ActiveRecord::Base
  validates_uniqueness_of :my_column_name
end

but it will work only at the application level, not at the database level.

What would you suggest ?

Was it helpful?

Solution

This is not super-helpful, but it looks like there is not a great answer for enforcing uniqueness at the database level. From the Rails migration guide:

The Active Record way claims that intelligence belongs in your models, not in the database. As such, features such as triggers or foreign key constraints, which push some of that intelligence back into the database, are not heavily used.

Validations such as validates_uniqueness_of are one way in which models can enforce data integrity.

Although Active Record does not provide any tools for working directly with such features, the execute method can be used to execute arbitrary SQL.

It looks like running the SQL command yourself with the ActiveRecord execute method may be the best way to go if you really want to enforce uniqueness in the database.

OTHER TIPS

Add a unique constraint to the database itself using:

add_index :my_models, :my_column_name, unique: true

...through a migration (and you might want to make that my_column_name not accept any null values too:

class CreateMyModels < ActiveRecord::Migration
  def change
    create_table :my_models do |t|
      t.string :my_column_name, null: false

      t.timestamps
    end

    add_index :my_models, :my_column_name, unique: true

  end
end
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top