2009-08-31 7 views
0

Eh bien, je ne sais pas si je me trompe complètement, mais je ne peux vraiment pas trouver une façon très pratique et directe de faire quelque chose comme:rails modèle: has_many avec des arguments de soi (PAS d'association)

class User < ActiveRecord::Base 

has_many :creations 

end 

mais la chose est, je veux juste que l'utilisateur ait beaucoup de créations si le user.developer == trueuser.developer est juste un champ booléen dans la table des utilisateurs.

Donc, des idées sur comment exactement pourrais-je le faire directement à partir du modèle?

Reprise, lorsque l'utilisateur est pas un développeur si vous essayez d'obtenir User.first.creations, User.first.creations.new ... créer ... détruire, etc vous obtenez un NoMethodError mais si c'est un développeur vous pouvez créer une nouvelle création.

La seule façon que je réussi à le faire est l'extension du modèle et de la vérification d'extension si le proxy_owner.developer == true mais en faisant cela je devais réécrire toutes les actions telles nouvelles, créer, mettre à jour, etc. ...

Toute aide serait très apprécié Merci beaucoup

Répondre

2

Que diriez-vous de sous-classer l'utilisateur et en ne spécifiant que has_many sur la sous-classe de développeur? Le développeur récupèrerait alors toute logique de l'utilisateur et les utilisateurs n'auraient aucune création.

class User < ActiveRecord::Base 
end 

class Developer < User 
    has_many :creations 
end 
+0

C'est vraiment le moyen de le faire. Exemple classique d'un comportement qui devrait être modélisé en héritage. Vous aurez besoin d'avoir une lecture rapide sur les rails STI pour voir comment le configurer, c'est vraiment très facile. Ensuite, vous pouvez aussi faire des choses comme Developer.find_blah. – dalyons

+0

Merci pour ces copains, en fait je l'ai fait avant de venir avec l'idée «excellente» d'utiliser moins de modèles sur mon application. Je pensais que ce n'est pas nécessaire d'avoir un nouveau modèle pour cela puisque c'est une chose très simple, alors j'ai commencé à changer mon. Mais comme je le vois probablement, je vais devoir revenir à cette idée. Mais une chose à coup sûr qui est vraiment intrigante est le fait qu'il n'y a pas de "moyen facile" de dire: "ok, je veux juste que ce modèle ait beaucoup: blas si ce modèle a cet atrribute", en plus de créer un nouveau modèle. – zanona

+0

J'ai essayé ceci (http://pastebin.com/f3eb450a3) Et cela a fonctionné sur le premier appel mais après qu'il ait créé le has_many: apps pour la première fois il l'attache à la classe ainsi aucune manière que vous pouvez surcharger plus. Mais, merci pour votre aide, il est vraiment apprécié – zanona

0

Y compris cela peut fonctionner. Sinon, vous devrez peut-être recourir au alias_method_chain, mais j'entends dire que cela a des liens avec le crime organisé sérieux, alors surveillez-vous.

module CreationsJustForDevelopers 
    def creations(*args) 
    if developer? 
     super 
    else 
     raise NoMethodError, "Only developers get creations." 
    end 
    end 
end 

Je ne sais pas ce que vous faites référence à tout ce qui parle de passer outre nouvelle, créer, mettre à jour, etc ... mais la seule autre méthode que je peux penser à supprimer est creation_ids, mais qui se soucie de cela?

+0

Merci pour ce cwninja cela m'a vraiment ouvert l'esprit sur l'implémentation d'une manière différente. mais malheureusement, il semble que le mixin ne remplace pas la méthode ** has_many: creations **, donc il ne prend pas effet. probablement que je fais quelque chose de mal. J'ai essayé de déclarer la fonction créations après le ** has_many: créations ** et ça a marché sur find quand son développeur et quand c'est pas mais quand développeur? Je reçois ce qui suit: ** NoMethodError: super: pas de méthode de superclasse 'créations ** je vais essayer de continuer à essayer obtenir un résultat de cela, Merci pour votre aide à nouveau :) – zanona

+0

la réponse de Jared est au-dessus encore plus net , sauf si, pour une raison quelconque, vous êtes obligé de le faire de cette façon. La méthode de non-super-classe peut vous être due, y compris le module avant la mise en place de l'association. Essayez de le déplacer après le 'has_many: créations'. – cwninja

+0

Oui, je remarque vraiment que cwninja. Probablement, je vais partir comme ça pour le moment, pour avoir plus d'expérience dans les changements internes. Mais merci beaucoup pour votre aide – zanona

Questions connexes