501 Stimmen

Wie mache ich eine Spalte eindeutig und indiziere sie in einer Ruby on Rails-Migration?

Ich würde gerne eine Kolumne erstellen unique in Ruby on Rails-Migrationsskript. Was ist der beste Weg, es zu tun? Gibt es auch eine Möglichkeit, eine Spalte in einer Tabelle zu indizieren?

Ich möchte Folgendes durchsetzen unique Spalten in einer Datenbank zu verwenden, anstatt nur :validate_uniqueness_of .

804voto

ndp Punkte 20756

Die kurze Antwort für alte Versionen von Rails (siehe andere Antworten für Rails 4+):

add_index :table_name, :column_name, unique: true

Um mehrere Spalten gemeinsam zu indizieren, übergeben Sie ein Array von Spaltennamen anstelle eines einzelnen Spaltennamens,

add_index :table_name, [:column_name_a, :column_name_b], unique: true

Wenn Sie "index name... is too long" erhalten, können Sie Folgendes hinzufügen name: "whatever" zur add_index-Methode hinzufügen, um den Namen kürzer zu machen.

Für eine feinkörnige Kontrolle gibt es eine " execute "Methode, die direktes SQL ausführt.

Das war's!

Wenn Sie dies als Ersatz für reguläre alte Modellvalidierungen verwenden, prüfen Sie, wie es funktioniert. Die Fehlermeldung an den Benutzer wird ohne Validierungen auf Modellebene wahrscheinlich nicht so schön sein. Sie können immer beides tun.

163voto

d.danailov Punkte 9178

rails generate migration add_index_to_table_name column_name:uniq

または

rails generate migration add_column_name_to_table_name column_name:string:uniq:index

erzeugt

class AddIndexToModerators < ActiveRecord::Migration
  def change
    add_column :moderators, :username, :string
    add_index :moderators, :username, unique: true
  end
end

Wenn Sie einen Index zu einer bestehenden Spalte hinzufügen, entfernen oder kommentieren Sie die add_column Zeile, oder setzen Sie einen Scheck ein

add_column :moderators, :username, :string unless column_exists? :moderators, :username

114voto

Pioz Punkte 5626

Wenn Sie eine neue Tabelle erstellen, können Sie die Inline-Verknüpfung verwenden:

  def change
    create_table :posts do |t|
      t.string :title, null: false, index: { unique: true }
      t.timestamps
    end
  end

58voto

Steve Grossi Punkte 2637

Da dies noch nicht erwähnt wurde, aber die Frage beantwortet, die ich hatte, als ich diese Seite fand, können Sie auch angeben, dass ein Index eindeutig sein soll, wenn Sie ihn über t.references ou t.belongs_to :

create_table :accounts do |t|
  t.references :user, index: { unique: true } # or t.belongs_to

  # other columns...
end

(zumindest ab Rails 4.2.7 )

21voto

Nicholas Nelson Punkte 201

Ich verwende Rails 5 und die oben genannten Antworten funktionieren gut; hier ist ein anderer Weg, der auch für mich funktioniert (der Tabellenname ist :people und der Spaltenname lautet :email_address )

class AddIndexToEmailAddress < ActiveRecord::Migration[5.0]
  def change
    change_table :people do |t|
      t.index :email_address, unique: true
    end
  end
end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X