Dans ActiveRecord, il existe un default_scope
pour spécifier une portée par défaut. Par exemple
class User < ActiveRecord::Base
default_scope where(:deleted => false)
end
User.all # => SELECT * FROM users WHERE deleted = 0;
Comment puis-je faire cela dans Sequel::Model
?
EDIT :
Après quelques recherches sur Google, j'ai fini par trouver des informations utiles.
class User < Sequel::Model
# Define some "scopes" (filters on the dataset)
dataset_module do
def existing
filter(deleted: false)
end
def active
filter(disabled: false)
end
end
# This is the equivalent to a default_scope. Set one of the datasets
# as the default dataset for this model.
set_dataset(self.active)
end
La requête générée ressemble alors à ceci :
User.all # => SELECT * FROM `users` WHERE (`deleted` IS FALSE)
D'ailleurs : L'équivalent de unscoped
es unfiltered
:
User.unfiltered.all # => SELECT * FROM `users`
Mais il y a un problème. Si vous essayez de mettre à jour un utilisateur que vous avez obtenu à partir d'un ensemble de données non filtré, il essaie de mettre à jour l'utilisateur en utilisant l'ensemble de données donné.
User.create(disabled: true, deleted: true)
User.all # => []
u = User.unfiltered.first # => Given user
u.disabled = false
u.save # => UPDATE users SET ... WHERE (disabled IS FALSE AND id = 1)
# => Sequel::NoExistingObject: Attempt to update object did not result in a single row modification
Je suis donc de retour au début. Y a-t-il un moyen de contourner ce problème ?