Définir une clé primaire unique basé sur 2 colonnes
Je voudrais définir une clé unique pour les enregistrements sur la base de 2 colonnes : 'id' et 'langue'
pour permettre à l'utilisateur soumet les chaînes suivantes :
id=1 langue=fr value=blabla anglais
id=1 langue=fr value=blabla français
J'ai essayé d'utiliser set_primary_key et aussi add_index mais il ne fonctionne pas ( add_index :les mots, ["id", "language_id"], :unique => true )
J'ai le modèle suivant :
class Word < ActiveRecord::Base
belongs_to :dictionnary
belongs_to :language
attr_accessible :lang, :rev, :value, :dictionnary_id, :language_id
validates :value, :uniqueness => true
end
et ce
class Language < ActiveRecord::Base
has_many :words
attr_accessible :lang
end
- si le mot appartient à un Langage pourquoi avez-vous besoin pour stocker les lang avec elle? Vous pouvez simplement déléguer le Modèle de Langue. Cela étant dit, vous serez en lutte contre les rails. Je voudrais juste utiliser l'ID de la clé comme clé primaire. délégué :lang à la Langue et à ne pas vous soucier de la clé composée
- en effet, merci. :lang vient d'ald scaffilding. J'ai besoin de l'enlever de là, depuis que j'utilise le modèle de Langue. Thx
Vous devez vous connecter pour publier un commentaire.
add_index :words, ["id", "language_id"], :unique => true
Il devrait fonctionner. Vous avez peut-être déjà certains non-unique des données dans votre base de données et d'index ne peut pas être créé? Mais (comme @Doon remarqué qu'il va être redondant, car l'id est toujours unique). Donc, vous devez créer la clé primaire sur les deux colonnes.
Définir 2 colonne de clé primaire dans les rails utilisation:
Et définir primary_key dans votre modèle avec ce bijou: http://rubygems.org/gems/composite_primary_keys:
validates :language_id, uniqueness: { scope: [:id] }
execute "ALTER TABLE words ADD CONSTRAINT contraint_name PRIMARY KEY (id, language_id)"
Dans les Rails 5, vous pouvez effectuer les opérations suivantes:
Il n'est PAS nécessaire de définir la
primary_key
attribut sur laWord
modèle.Comme je l'ai dit dans mes commentaires, vous serez en lutte contre les rails si vous essayez cela, et il n'est pas vraiment pris en charge hors de la boîte. vous pouvez regarder http://compositekeys.rubyforge.org qui offre un moyen de faire des clés primaires composées dans les rails. Je ne l'ai pas utilisé, comme je n'ai pas eu besoin d'encore (normalement quand j'ai quelque chose qui est clé composite comme c'est juste une table de jointure avec pas de clé primaire et un index unique sur la rejoint paire (HABTM).
Modèle
Migration
Vous obtiendrez ce tableau
En fonction de votre utilisation, vous pouvez essayer des clé composite gem qui vous permet de définir les clés primaires composites et aussi ehances ActiveRecord pour traiter ce type de modèle (aide beaucoup pour les associations à ce modèle ou pour url_for aides etc.).
Donc, si vous planifiez à l'aide de ce modèle, comme tous les autres rails modèle de la gemme aidera beaucoup.
J'ai fait face à un problème similaire lors de la migration d'un site vers les Rails. J'ai eu une table qui stocke les données de texte pour chaque langue est disponible sur mon site donc je avais quelque chose comme cela:
Mais depuis que les Rails ne gère pas les clés primaires composites hors de la boîte, j'ai été contraint de changer la structure de la table de sorte qu'il avait sa propre clé primaire:
J'ai également créé un index unique pour les colonnes qui ont fait de la clé primaire composite de sorte qu'aucune copie de l'enregistrement est inséré. Ensuite dans mon Rails modèle je pourrais simplement:
Et qui a fait le tour. N'est pas ce que je voulais mais c'est mieux que de se battre contre le cadre.
Tout comme @rogal111 dit, mais si une clé primaire existe déjà, alors vous aurez envie de faire cette