2010-05-13 8 views

Antwort

7

Sie können eine Validierung zu Ihrem Modell hinzufügen duplizierten Werte

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

dies wird nicht auf der MySQL-Tabelle Ebene arbeiten ... – ohana

+0

dies war für mich mit mysql Ver 14.14 Distrib 5.5.31, für debian-linux-gnu (x86_64). Ich mochte diese Lösung. – Askar

+0

Bei starkem Verkehr mit mehreren Prozessen kann dies zu Problemen führen. – lulalala

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

:)

und fügen Sie dann die Validierung als @j zu verbieten. antwortete

-1

Jemand korrigiert mich, wenn ich falsch liege, weil ich das persönlich nicht verwendet habe, aber ich glaube, dass Sie eine Migration verwenden können, um Eindeutigkeit auf der Datenbankebene zu setzen.

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

hat dieses versucht, hat nicht funktioniert. – ohana

+0

mysql. nachdem ich das getan habe, fügte ich doppelte Daten in die Datenbank ohne ein Problem hinzu. – ohana

+0

Ich glaube, der ': unique' Schlüssel ist die Option, die nur zu' add_index' gehört. – lulalala

3

Dies ist Code direkt aus meinem Arbeitsprojekt:

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

Notiere die Grenze Funktionalität ist nur erforderlich, wenn Sie auf einem Textfeld einzigartig verwenden (anstatt eines Strings), obwohl es isn t implementiert in Schienen noch (kommen in 3.0 glaube ich). Sie können mithilfe des 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) 

dieses Beispiel einen eindeutigen Index für drei Spalten-Plugin, um diese Einschränkung zu bekommen ist die Schaffung wenn Sie ihn für eine Spalte verwenden können, wenn Sie es wünschen.

Link zum Projekt auf 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 

oben vorgeschlagen brechen können, wenn Sie Unicorn laufen auf mehreren Heroku dynos, die jeweils mit mehreren Web-Prozesse usw.

so einen besseren Weg zu tun, wäre es

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

sein

oder Sie können dazu row sql in migration verwenden.

execute <<-SQL 
    ALTER TABLE Persons 
    ADD UNIQUE (P_Id) 
SQL 
Verwandte Themen