9 votes

default_scope dans Sequel

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 ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X