0

Dans les rails 3.2.3, je veux valider qu'un modèle de lien a une combinaison unique de deux champs. J'ai un test et une validation qui passe le test comme indiqué ci-dessous, mais il semble qu'il pourrait y avoir une meilleure façon de le faire. Par exemple, serait-il préférable d'utiliser un index avec unicité? Si oui, pourquoi?Meilleure façon de valider l'unicité de deux champs ensemble en utilisant la portée dans les rails

# link_test.rb 
... 
test "cannot create two links with same name and url" do 
    Link.create!(:name => 'example', :url => 'http://www.example.com') 
    assert_raise(ActiveRecord::RecordInvalid, 'could create two links with same name and url'){Link.create!(:name => 'example', :url => 'http://www.example.com')} 
end 
... 

# link.rb 
class Link < ActiveRecord::Base 
    ... 
    validates :name, :uniqueness => {:scope => :url, :message => 'cannot have two entries with same name and url'} 
    ... 
end 

Répondre

1

Je voudrais utiliser les deux. L'avantage d'utiliser un index unique est que la base de données l'appliquera également. Si, par exemple, vous avez une demi-douzaine de serveurs d'applications dont chacun peut créer un nouvel enregistrement, alors la protection de l'unicité des rails est extrêmement difficile à sous-estimer le problème. L'inconvénient est que cela est plus difficile à récupérer. L'avantage de le faire dans l'enregistrement actif est que vous pouvez facilement le déboguer, obtenir des messages d'exception propres et communiquer le problème plus efficacement à l'utilisateur. L'inconvénient est qu'il nécessite une requête supplémentaire et qu'il est plus vulnérable aux erreurs de type multithread/multiprocessus. Avec les deux vous obtenez la possibilité de récupérer une validation d'enregistrement active lorsque cela est possible combiné avec la fiabilité absolue d'un index unique de base de données. Vous pouvez toujours voir une erreur différente dans les rares cas où deux demandes arrivent exactement au même moment, mais cela gardera vos données en ligne avec vos contraintes.

Questions connexes