Je souhaite créer une table des autorisations (gestion des autorisations pour entrer dans une salle) qui relie l'utilisateur et la salle
Type de référence avec utilisateur et tâche sous forme de colonnes
Contrainte de ne pas enregistrer lorsqu'un ensemble de (user_id, task_id) qui existe déjà dans la table est entré
Je souhaite vérifier sur la console si cette validation fonctionne correctement
Cette validation peut être réalisée en utilisant la "contrainte d'unicité".
Cette fois, il s'agit d'un enregistrement de l'opération sur la console lancée par les rails c pour voir si cela est correctement implémenté.
macOS Catalina 10.15.6
ruby 2.6.5
Rails 6.0.3.4
MySQL : 5.6.47
app/models/permission.rb
class Permission < ApplicationRecord
belongs_to :user
belongs_to :task
validates :user_id, uniqueness: { scope: :task_id }
end
Soit dit en passant, il s'agit d'une restriction sur l'application, et pour être exact, il est également nécessaire d'appliquer une restriction côté DB (<a href-"https://railsguides.jp/active_record_validations.html#uniqueness:title"> Rails Guide < À partir de / a>). Cependant, je ne le comprends pas encore, je vais donc l'omettre cette fois.
Je voulais vérifier la contrainte d'unicité, j'ai donc exécuté le code selon le flux suivant.
Obtenez des enregistrements existants avec Permission.find (nombre)
Attribuer à une variable appropriée
Vérifiez s'il peut être sauvegardé avec la méthode valide?
Devrait être "faux"
J'ai lancé la console dans le terminal et vérifié.
teminal
$ rails c
[1] > permission = Permission.find(1)
=> #<Permission:*** id: 1, user_id: 1, task_id: 1, ***>
[2] > new.valid?
=> true
C'est devenu vrai ... J'ai pensé à la cause et j'ai changé la commande.
[Cause] ▶ "find" est une méthode ActiveRecord qui recherche les enregistrements existants ▶ Si vous enregistrez ceci, cela ressemblera-t-il à une sauvegarde par écrasement?
【Changement】 ▶ Tapez directement user_id et task_id
terminal
$ rails c
[1] > Permission.find(1)
=> #<Permission:*** id: 1, user_id: 1, task_id: 1, ***>
[2] > permission = Permission.new(user_id: 1, task_id: 1)
=> #<Permission:*** id: nil, user_id: 1, task_id: 1, ***>
[3] > permission.valid?
=> false
[4] > permission.errors.full_messages
=> "User has already been taken"
J'ai pu confirmer que c'était complètement faux.
La contrainte d'unicité de plusieurs clés peut être spécifiée avec l'option d'étendue
Créez un nouvel enregistrement pour confirmation
J'étais un peu accro, mais j'ai réussi à m'en remettre. Afin de vraiment comprendre, il semble nécessaire de savoir ce qui fonctionne derrière save and valid.
J'ai encore beaucoup à étudier, mais je vais les réduire un par un.
Qiita: unicité: explication de la méthode de contrainte unique utilisant la portée
Blog externe: [Rails] Méthode de contrainte unique utilisant plusieurs colonnes [unicité: scope]
Recommended Posts