2010-08-26 18 views
1

Je voudrais extraire la logique des contrôleurs vers quelque part que cela puisse être plus SEC. Quelle est la meilleure façon de gérer quelque chose comme ce qui suit dans Rails?Meilleure pratique pour extraire des requêtes de modèle ActiveRecord dans Rails?

Par exemple, plutôt que d'avoir la requête dans les contrôleurs, je pourrais le placer dans le modèle:

class SmoothieBlender < ActiveRecord::Base 
    belongs_to :user 

    def self.get_blenders_for_user(user) 
     self.where(["user_id = ?", user.id]) 
    end 
end 

Ou serait-il préférable de créer un module en tant que couche de service et inclure dans chaque modèle qui l'utilise? Ou simplement en faire une classe de service complète accessible depuis le contrôleur User et Blender? Où mettriez-vous cette classe?

class BlenderService 
    def self.get_blenders_for_user(user) 
     SmoothieBlender.where(["user_id = ?", user.id]) 
    end 
end 

Je suis nouveau à Ruby et Rails, donc si cela est une question/syntaxe stupide est incorrecte, pardonnez-moi. Merci d'avance!

Répondre

5

Je créerais un named_scope (je pense qu'il est juste scope dans Rails 3)

class SmoothieBlender < ActiveRecord::Base 
    belongs_to :user 

    scope :for_user, lambda { |user_id| 
     where("user_id = ?", user_id) 
    } 
end 

De cette façon, vous pouvez appeler

SmoothieBlender.for_user(user.id) 
+0

Ahh, a du sens! Un peu comme les extensions dans .Net. Merci! – MunkiPhD

+1

Si le paramètre provient d'un formulaire en params, n'oubliez pas d'utiliser .to_i dessus. Par exemple où ("user_id =?", User_id.to_i) –

+0

to_i va essayer de l'analyser et échouer si ce n'est pas désinfecté je présume? – MunkiPhD