2010-04-01 5 views
3

J'ai une classe Post et une classe Comment. J'ai un post objet et je veux le convertir en un objet Comment. Je suis passé par Rails api et trouvé devient (klass). Pour l'instant, il n'y a pas d'association entre un message et un commentaire. Alors j'ai essayéComment utiliser devient dans les rails

@post.becomes(Comment) 

mais devient méthode n'a pas pu être trouvé pour objet @post. Est-ce que je manque quelque chose?

Répondre

0

Je suppose que vous parlez de classes dérivant de ActiveRecord :: Base. Dans ce cas, je pense que vous avez deux options si vous voulez vraiment convertir les messages dans les commentaires (ce qui me semble un peu étrange):

  • Vous pouvez avoir une seule classe (par exemple, entrée) avec un attribut qui marque comme un post ou un commentaire, que vous définissez comme approprié
  • Vous pouvez créer et enregistrer un nouvel objet de commentaire contenant le texte de l'objet de publication, puis supprimer l'objet de publication.
+0

Je suis en train de typer des objets. J'ai défini une méthode pour une classe et un autre objet de classe nécessaire pour accéder à cette méthode. Je pourrais également l'inclure dans un assistant commun, mais je suis tombé sur ceci et cette idée fonctionne comme je le pensais. Je voulais donc savoir comment cela fonctionne. –

+2

Ok, dans ce cas je pense que pour 'devient 'au travail Post doit hériter de Comment. Comme la documentation le dit, 'devient 'est utile quand vous voulez qu'une instance d'une sous-classe apparaisse comme une instance d'une superclasse. –

+0

Très tard dans la fête, mais à partir de (au moins) 4.2ish, 'devient' peut fonctionner entre deux objets sans rapport. Ne pas le conseiller d'une façon quelconque, juste en disant que cela fonctionne. –

3

Mettez les méthodes que vous souhaitez que les deux modèles utilisent sur un module. Ensuite, incluez ce module dans les deux modèles.

+0

Merci. La solution est correcte. Accepter la réponse ci-dessus comme j'ai obtenu une explication précise à utiliser devient. :) Toutes mes excuses pour le retard! –

3

Veuillez noter que devient renvoie un nouvel objet mais ne modifie pas l'objet existant. Vous devez faire la mission vous

@post = @post.becomes(Comment) 

Voir la documentation ActiveRecord::Persistence#becomes

Questions connexes