2010-09-23 3 views
13

J'ai un modèle qui nécessite le chargement de données externes à partir d'une source auxiliaire. Il existe un certain nombre de services Web pour lesquels mon modèle peut extraire les données (permutables), mais je ne souhaite pas créer de code qui rendrait difficile le changement de service (les coûts varient considérablement en fonction de l'utilisation variable et fixe). sera requis).Modèle utilisant des modules dans les rails Application

Je voudrais créer un pilote pour effectuer l'interaction (et ensuite créer d'autres pilotes personnalisés si le service nécessite une commutation). Malheureusement, en raison du couplage étroit du pilote et du modèle, il n'est pas logique d'extraire le code dans un plugin ou une gemme. J'ai extrait tout le code dans un module (voir l'exemple), et j'ai actuellement le code déclaré au-dessus de mon modèle.

module Synchronize 
    def refresh 
    self.attributes = ... 
    self.save 
    end 
end 

class Data < ActiveRecord::Base 
    include Synchronize 
end 

Est-ce que Rails (3.0.0) a une convention pour stocker des modules étroitement couplés à des modèles? Dois-je utiliser un plugin pour le faire? Est-ce associé au répertoire 'app/helpers'? Si non, où est l'endroit le plus approprié pour stocker le code? Merci!

Répondre

27

Vous avez raison de dire que si le module est étroitement couplé à ce modèle spécifique, ce n'est pas un bon candidat pour un gem/plugin. App/helpers/est pour les méthodes auxiliaires de visualisation et ne doit pas contenir de modules qui sont uniquement destinés à être mélangés dans des modèles.

Vous pouvez placer le module dans lib /. C'est pour le code qui ne rentre pas vraiment dans l'application/et qui est souvent la base initiale d'un code faiblement couplé avant qu'il ne soit déplacé vers un plugin (mais ce n'est pas une règle stricte). Cependant, puisque votre module est étroitement couplé à votre modèle, lib/peut ne pas être le meilleur endroit pour cela. Je sais que 37signals (et d'autres) utilisent le concept de 'préoccupations' comme un moyen de garder le code de modèle lié organisé en modules. Ceci est implémenté en créant app/concerns/et en mettant les modules dedans. Ce répertoire est ensuite ajouté au chemin de charge dans config/application.rb de l'application (config/environment.rb pour Rails 2) avec:

config.load_paths += %W(#{Rails.root}/app/concerns) 

Le module peut alors être mélangé dans le modèle normal.

Voici le message blog à ce sujet par Jamis Buck - http://weblog.jamisbuck.org/2007/1/17/concerns-in-activerecord

Une autre variante de ce que je préfère personnellement, bien qu'il ne comporte pas de modules, utilise ce plugin: http://github.com/jakehow/concerned_with

Espoir qui aide .

3

Ce lien m'a aidé à contourner ce problème.

http://ander.heroku.com/2010/12/14/concerns-in-rails-3/

Je suis coller dans un modèle/répertoire d'extensions. Le répertoire des préoccupations a du sens, mais le mot «préoccupations» ne me semble pas évident. Peut-être que ça va grandir sur moi.

J'ai aussi ajouté le chemin d'extensions dans le application.rb

config.autoload_paths += %W(#{config.root}/app/models/extensions) 
Questions connexes