2010-11-08 9 views
2

Je travaille sur un petit moteur de blog.Comment commander par Rails?

Il existe les tableaux suivants: Blog et message.

Blog a une clé étrangère: last_message_id, donc j'accéder au dernier message dans le blog en appelant blog.last_message

Je le code suivant pour le faire fonctionner:

class Blog < ActiveRecord::Base 
    belongs_to :last_message, :class_name => "Message" 
end 

Je dois commander les blogs par les derniers messages. Mais quand j'appelle

blogs.order("last_message.created_at DESC") 

Cela ne fonctionne pas. Je reçois l'erreur suivante:

PGError: ERROR: missing FROM-clause entry for table "last_message" 
ORDER BY last_messa... 

Comment puis-je le faire fonctionner?

MISE À JOUR

est ici la solution:

blogs.joins(:last_message).order("messages.created_at DESC"). 
+0

ce que signifie-vous par ne marche? – shingara

+0

@shingara, j'ai mis à jour le post. – Alex

Répondre

3

Je pense que votre modèle est faux. Voir les rails ajouter automatiquement 2 attributs à un modèle: created_at et update_at. Donc, avoir une relation comme vous décrivez est redondant. Pour moi, il devrait ressembler à ceci:

#model/blog.rb 
class Blog < ActiveRecord::Base 
    has_many :messages 
end 

#model/message.rb 
class Message < ActiveRecord::Base 
    belongs_to :blog 
end 

Ensuite, pour obtenir les blogs commandés par le dernier message, vous pouvez le faire:

Blog.joins(:messages).order("messages.created_at_desc") 

Ce que vous avez peut-être remarqué vous donnera le double entrées pour votre modèle de blog. Si ce n'est pas un problème, allez-y. Si c'est le cas, vous avez deux options: faire un each et tester si vous avez déjà vu le blog - sinon, vous l'affichez. Ou, vous pouvez écrire votre propre sql.

+0

Vous avez manqué la question. Dans le datamodel d'Alex, il sait pour chaque blog quel est le dernier message. Juste pour éviter ce problème de double message. – nathanvda

+0

J'ai souligné que c'est redondand avec created_at - après, il fait ce qu'il veut. –

+0

c'est un bon point. Mais la chose est, j'ai déjà le très un schéma. Blog has_many: messages et message appartiennent à: blog. J'ai aussi la propriété LAST_MESSAGE, et c'est là que le problème est. – Alex

1

Vous devez vous assurer que les derniers-messages sont également sélectionnés pour faire ce travail-commande de commande \ donc quelque chose comme:.

blogs.includes(:last_message).order("last_message.created_at desc") 
+0

Je pense que vous êtes dans la bonne direction. Cependant, il renvoie toujours une erreur. Je vais essayer de trouver plus d'informations sur la méthode "includes". – Alex