2010-05-13 23 views

Respuesta

7

Usted puede agregar una validación de su modelo de prohibir los valores duplicados

class MyModel < ActiveRecord::Base 
    validates_uniqueness_of :my_column_name 
end 
+3

esto no funcionará a nivel de tabla MySQL ... – ohana

+0

Esto funcionó para mí con MySQL Ver 14,14 Distrib 05/05/31, para Debian-linux-gnu (x86_64). Me gustó esta solución. – Askar

+0

Para tráfico pesado con procesos múltiples, esto puede romperse. – lulalala

-4
counter = 0 
Model.all.each {|m| m.some_value = counter; m.save; counter += 1;} 

:)

y luego añadir la validación como @j. respondió

-1

Alguien me corrige si me equivoco porque no lo he usado personalmente, pero creo que puede usar una migración para establecer la unicidad en el nivel de la base de datos.

def self.up 
    change_column :<table name>, :<attribute name>, :<data type>, :unique => true 
end 
+0

intenté este, no funcionó. – ohana

+0

mysql. después de hacerlo, agregué datos duplicados a la base de datos sin ningún problema – ohana

+0

Creo que la clave ': unique' es la opción que pertenece a' add_index' solamente. – lulalala

3

Este es el código directamente de mi proyecto de trabajo:

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

Nota la funcionalidad límite sólo es necesario si usted está usando único en un campo de texto (en lugar de cadena) a pesar de que ISN' t implementado en rails aún (creo que en 3.0). Puede superar esta limitación utilizando el plug-in 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) 

este ejemplo es la creación de un índice único de tres columnas, aunque se puede utilizar para una columna si lo desea.

Enlace al proyecto en GitHub: http://github.com/thinkbohemian/WhySpam/blob/master/db/migrate/20091223193335_add_unique_index.rb

4
class MyModel < ActiveRecord::Base 
    validates_uniqueness_of :my_column_name 
end 

sugirió anteriormente puede romper, si se está ejecutando unicornio en varios dinamómetros Heroku, cada uno con múltiples procesos web, etc

así una mejor manera hacerlo sería

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

o puede usar sql sin procesar en la migración para hacer esto.

execute <<-SQL 
    ALTER TABLE Persons 
    ADD UNIQUE (P_Id) 
SQL 
Cuestiones relacionadas