2009-11-25 23 views
0

Est-il possible de créer une association conditionnelle avec DataMapper?DataMapper a n avec des conditions

Par exemple:

Je veux que l'utilisateur n Apps juste si cet utilisateur a l'attribut :developer => true

quelque chose comme ceci:

class User 
    include DataMapper::Resource 
    property :id, Serial 
    property :name, String, :nullable => false 
    property :screen_name, String, :nullable => false, :unique => true 
    property :email, String, :nullable => false, :unique => true, :format => :email_address 
    property :password, BCryptHash, :nullable => false 
    property :developer, Boolean, :default => false 

    #The user just gets apps if developer 
    has n :apps #,:conditions => "developer = 't'" 

end 

class App 
    include DataMapper::Resource 
    property :id, Serial 
    property :name, String, :nullable => false 

    belongs_to :user 
end 

Je sais que ce serait possible en créant une sous-classe de l'utilisateur en tant que développeur :: utilisateur et dans cette classe, utilisez le has n, mais j'aimerais vraiment savoir s'il est possible de le faire directement sur la déclaration d'association.

Une autre façon que j'ai également réussi à faire en utilisant ARn était d'étendre l'association et de réécrire les méthodes pour chaque action.

donc sur le module d'extension je pourrais avoir quelque chose comme ceci:

module PreventDeveloperActions 
    def new 
    if proxy_owner.developer? 
     super 
    else 
     raise NoMethodError, "Only Developers can create new applications" 
    end 
    end 

# and so on for all the actions ... 
end 

Mais encore une fois, je voudrais vraiment éviter l'utilisation de ces solutions si possible, mais juste s'il est possible d'effectuer une rapide et méthode directe facilement avec DataMapper :)

Merci à l'avance

Répondre

2

à l'heure actuelle, les conditions que vous incluez dans la déclaration de relation ne s'applique à la cible. Donc, si le modèle cible a une propriété: active, vous pouvez dire des choses comme has n, :apps, :active => true. Malheureusement, vous ne pouvez pas définir (encore) les relations qui ne sont actives que dans l'état actuel de la source.

Il y a quelques propositions que je considère pour développer la logique de requête dans DM, mais je ne suis pas sûr quel sera l'impact sur le code, et quelles capacités supplémentaires il fournira à part ceci. C'est peut-être quelque chose que nous attaquons après DM 1.0, car il affecte également plus de 50 adaptateurs et plugins. ST est normalement ce que je recommanderais pour quelque chose comme ça, car cela vous permettra de définir des relations qui n'existent que pour ce type d'objet. Une autre approche consisterait à définir les relations comme normales, à marquer les méthodes accessor/mutator comme privées, puis à ajouter une méthode proxy qui équivaut à return apps if developer?.

+0

Salut Dan, merci beaucoup pour votre attention et votre soutien, C'est vraiment apprécié :) Je vais essayer ces méthodes que vous avez mentionnées, mais je suis sûr que cela va résoudre mon problème :) merci encore – zanona