2009-08-03 5 views
14

que j'ai un modèle utilisateur avec le code suivant dans User.rb:Les appareils déclenchent-ils des rappels de modèles?

before_create :create_dependencies 
after_create :build_inbox 

Et j'ai aussi un fichier users.yml avec un tas d'appareils de l'utilisateur sont définies. Lorsque j'exécute rake db: fixtures: load, cela ne semble pas déclencher les rappels.

  1. Est-ce ainsi que cela devrait fonctionner? Si oui, pourquoi l'ont-ils conçu de cette façon?
  2. Existe-t-il un moyen de forcer le déclenchement des rappels lors du chargement des appareils?

Répondre

20

Est-ce ainsi que cela devrait fonctionner? Si alors, pourquoi l'ont-ils conçu de cette façon?

Oui, les appareils n'utilisent pas les rappels. Je suppose que c'est pour des raisons de performance. Il est plus rapide de charger les données directement dans la base de données sans instancier le modèle.

Y at-il un moyen de forcer le déclenchement des callbacks lors du chargement appareils?

Pas que je sache. Vous avez plusieurs options. L'un est de construire vos appareils comme si les rappels étaient déjà déclenchés. C'est-à-dire, créez manuellement les données que les rappels feraient. Par exemple, si vous avez un rappel qui hache le mot de passe d'un utilisateur, vous devrez le hacher manuellement, puis stocker ce hachage dans le projecteur.

La deuxième solution (et fortement recommandé!) Est d'utiliser des usines. Les usines déclenchent des rappels et vous permettent d'utiliser des attributs virtuels, etc. En effet, elles instancient le modèle à chaque fois. Un joyau populaire est Factory Girl. Un autre à essayer est Machinist. J'ai également créé un Railscasts episode sur le sujet.

+0

Parfait, merci. – cakeforcerberus

+0

+1 à la fille de l'usine. Il y a 2 mois, il y a eu un changement, et je n'ai jamais regardé en arrière. –

+0

+1 parce que Factory Girl est tellement incroyable ... prenez l'heure de l'apprendre, vous rattraperez très vite votre temps perdu. – Emerson

4

J'ai aussi ce problème. Notre application calcule des totaux avant l'enregistrement, de sorte qu'il n'est pas nécessaire de le faire à la volée. Rend les rapports plus rapides et supprime quelques jointures sur certains rapports.

Dans les essais pour les objets que nous courons manuellement les callbacks comme celui-ci:

before do 
    order.perform_callbacks 
end 

Cela fonctionne bien parce qu'il ne fonctionne pas tout le temps pour que d'autres tests ne souffrent pas.

Nous utilisons minitest et les appareils d'éclairage btw.

+0

Où vit ce code? Haut de l'appareil? Qu'est-ce que l'ordre? – hellion

+0

Salut, hellion. Le code se trouve en haut de mon fichier de test dans un fichier avant car pour moi dans ce cas j'en ai besoin pour chaque test dans ce fichier. Si vous avez seulement besoin de vous assurer que les rappels s'exécutent pour 1 test, vous pouvez simplement placer le .perform_callbacks dans ce test particulier. – jacklin

+0

Qu'est-ce que 'order', une classe, une instance? Il est étrange que je ne puisse pas trouver 'perform_callbacks' documenté n'importe où. –

Questions connexes