ruby-on-rails example - Comment rendre une colonne unique et l'indexer dans une migration Ruby on Rails?




open classroom (7)

Vous pouvez ajouter le nom de la clé unique autant de fois que le nom unique_key par défaut des rails peut être trop long pour que la base de données puisse lancer l'erreur.

Pour ajouter un nom à votre index, utilisez simplement l'option name: La requête de migration peut ressembler à ceci:

add_index :table_name, [:column_name_a, :column_name_b, ... :column_name_n], unique: true, name: 'my_custom_index_name'

Plus d'infos - http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index

Je voudrais faire une colonne unique dans le script de migration Ruby on Rails. Quelle est la meilleure façon de le faire? Y a-t-il aussi un moyen d'indexer une colonne dans une table?

Je voudrais appliquer unique colonnes unique dans une base de données plutôt que d'utiliser simplement :validate_uniqueness_of .


Comme cela n'a pas encore été mentionné mais répond à la question que j'avais lorsque j'ai trouvé cette page, vous pouvez également spécifier qu'un index doit être unique lorsque vous l'ajoutez via t.references ou t.belongs_to :

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

  # other columns...
end

(à partir d'au moins Rails 4.2.7 )


les rails génèrent la migration add_index_to_table_name nom_colonne: uniq

ou

rails génère la migration add_column_name_to_table_name nom_colonne: chaîne: uniq: index

génère

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

Si vous ajoutez un index à une colonne existante, supprimez ou commentez la ligne add_column ou insérez une vérification

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

Si vous créez une nouvelle table, vous pouvez utiliser le raccourci en ligne:

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

La réponse courte:

add_index :table_name, :column_name, unique: true

Pour indexer plusieurs colonnes ensemble, vous passez un tableau de noms de colonnes au lieu d'un seul nom de colonne,

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

Pour un contrôle plus fin, il existe une méthode " execute " qui exécute un SQL direct.

C'est tout!

Si vous faites cela en remplacement des anciennes validations de modèles, vérifiez simplement comment cela fonctionne. Je ne suis pas sûr que le rapport d'erreur à l'utilisateur sera aussi gentil. Vous pouvez toujours faire les deux.


J'utilise Rails 5 et les réponses ci-dessus fonctionnent très bien; Voici une autre façon qui a également fonctionné pour moi (le nom de la table est :people et le nom de la colonne est :email_address )

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

Alternative à la levée d'une exception ou tentative de recréation d'une table désormais vide - tout en permettant l'annulation de la migration, la restauration, etc.

def change drop_table(:users, force: true) if ActiveRecord::Base.connection.tables.include?('users') end





ruby-on-rails