2010-11-05 14 views
3

J'ai un formulaire qui a beaucoup de contacts. Je veux être en mesure de supprimer les contacts sans vraiment les supprimer, mais en les marquant supprimés. J'ai ajouté un attribut "deleted" à ma table de contacts.rails implémentant l'attribut supprimé

Dans la plupart des cas, je veux un formulaires contacts Je veux que ceux qui ne sont pas supprimés:

form.contacts.find_all_by_deleted(false) 

Cela semble désordre, donc je pensais d'un named_scope ou un default_scope, mais beaucoup de gens semblent disent qu'ils sont méchants.

J'ai aussi pensé à changer juste la relation sur le formulaire pour être (Est-ce le même que la portée par défaut est-il le mal?):

has_many :contacts, :conditions => ["deleted = false"] 

À mon avis admin je dois être en mesure de voir tous les contacts. Je suppose que je peux juste faire une recherche du côté Contacts en ajoutant l'identifiant du formulaire.

On dirait que c'est quelque chose que les gens implémenteraient beaucoup et qu'il devrait y avoir une bonne entente sur les meilleures pratiques.

Toute solution doit fonctionner dans Rails 2 et ne pas être obsolète pour Rails 3. Préférez aucun plugin ou gemme.

+0

Pourquoi préférez-vous ne pas utiliser une gemme? Pourquoi préféreriez-vous implémenter votre propre code, qui est plus de travail, moins testé, et moins de fonctionnalités? http://www.ruby-toolbox.com/categories/activerecord_soft_delete.html – ryeguy

+1

Salut Ryeguy, les gemmes sont géniales si elles apportent une valeur significative, mais l'inconvénient est la maintenabilité du code. Pour une classe pour 1 problème, l'ajout d'un bijou semble trop pour moi. Si je le voulais sur tous mes modèles, ça en valait probablement la peine. Beaucoup de gemmes sont mal entretenues, le passage des versions des rails les brise, elles ont des conséquences inattendues. Nous prévoyons que cette base de code sera très largement déployée, nous essayons donc de limiter autant que possible les dépendances. En regardant les suggestions de KandadaBoggus ci-dessous, cela ressemble à 2 lignes de code vs une autre gemme. – Joelio

Répondre

1

Approche 1: Associations:

class User 
    has_many :active_contacts, :class_name => "Contact", 
          :conditions => {:deleted => false} 
    has_many :contacts 
end 

Dans votre contrôleur d'administration utilisent l'association contacts, où tous les autres utilisent l'association active_contacts.

Approche 2: default_scope:

class User 
    has_many :contacts 
end 

class Contact 
    default_scope {:conditions => {:deleted => false}} 
end 

Pour les utilisateurs réguliers:

u.contacts 

Pour les utilisateurs admin:

User.send(:with_exclusive_scope){u.contacts} 

J'ai utilisé default_scope pour exclure deleted enregistrements. Les gens sont nerveux à propos de default_scope pour une bonne raison, car parfois il peut causer un comportement inattendu.