2010-06-17 4 views
3

permet donc dire que j'ai une classe comme ci-dessousDatamapper, définissant vos propres méthodes d'objet, comment?

class List 
    include DataMapper::Resource 
    property :id, Serial 
    property :username, String 

    def self.my_username 
    return self[:username] 
    end 
end 

list=List.create(:username=>,'jim') 
list.my_username 

Quand je lance cela, il me dit que la méthode ne peut être trouvée, et une enquête plus approfondie que vous ne pouvez définir des méthodes de classe (objet non méthodes) et Les méthodes de classe n'ont pas accès aux données des objets.

Est-il possible d'inclure ces méthodes en tant que méthodes d'objet et d'accéder aux données d'objet? J'utilise Ruby 1.8.6 et la dernière version de datamapper.

+1

Pourquoi définir comme ClassMethod si vous l'utilisez seulement comme InstanceMethod? – shingara

Répondre

7

Évitez tous les soi-même et il se InstanceMethod:

class List 
    include DataMapper::Resource 
    property :id, Serial 
    property :username, String 

    def my_username 
    return self[:username] 
    end 
end 

list=List.create(:username=>'jim') 
list.my_username 
+0

Cela ne devrait pas être (: nom d'utilisateur => 'jim') sans la virgule? –

+0

votre droit, je supprime la virgule – shingara

4

Vous pouvez penser à la portée de la classe comme Model (une table dans un SGBDR) et du champ d'instance que le Resource (une ligne dans un SGBDR). Maintenant, si vous définissez des méthodes de classe (comme vous l'avez fait avec self.my_username), vous opérez sur le Model (alias la table, alias toutes les lignes). Si vous définissez des méthodes d'instance, celles-ci seront disponibles pour une ligne Resource (alias une ligne).

Les cas d'usage typiques pour les méthodes de classe consistent à construire (des chaînes de) requête (s). Ceux-ci fonctionneront essentiellement au même effet que 2.x named_scope d'Active Record. Vous pouvez appeler une chaîne de méthodes de classe et ne pas exécuter une seule requête, tant que vous n'accédez pas explicitement aux données que la requête est censée fournir. DataMapper continuera à construire et modifier les objets de requête jusqu'au moment même où vous avez réellement besoin d'accéder aux données. Cela ne fonctionne que si chaque méthode de classe dans la chaîne renvoie une instance de DataMapper::Collection qui est généralement obtenue en retournant le résultat des appels à all (ou la combinaison de ceux-ci avec les opérateurs Posé comme +, -, & et |.

Questions connexes