2010-11-08 55 views
2

我正在研究一个小博客引擎。如何在Rails中进行排序?

有以下表格:博客和消息。

博客有一个外键:last_message_id,所以我通过调用blog.last_message访问该博客的最后一条消息

我有下面的代码,使其工作:

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

我需要通过最后的消息来订购博客。但当我打电话

blogs.order("last_message.created_at DESC") 

它不起作用。我收到以下错误:

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

我该如何让它工作?

UPDATE

这里的解决方案:

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

什么你是指不工作? – shingara 2010-11-08 09:27:52

+0

@shingara,我已更新帖子。 – Alex 2010-11-08 09:33:34

回答

3

我觉得你的模式是错误的。请参阅导轨自动将2个属性添加到模型中:created_atupdate_at。所以像你所描述的那种关系是redondant。对我来说,应该是这样的:

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

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

然后,为了获得通过的最后一条消息下令博客,你可以这样做:

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

,当你可能已经注意到会给你加倍您的博客模型的条目。如果这不是问题,请继续。如果是,你有两种选择:做一个each并测试你是否已经看到博客 - 如果没有,则显示它。或者,你可以编写你自己的sql。

+0

你错过了这个问题。在Alex的数据模型中,他知道每个博客最后的信息。只是为了避免这个双重信息问题。 – nathanvda 2010-11-08 09:42:13

+0

我指出它是redondand与created_at - 之后,他做他想做的事。 – 2010-11-08 09:44:20

+0

这是一个很好的观点。但事情是,我已经有了一些架构。博客has_many:消息和消息belongs_to:博客。我也有LAST_MESSAGE属性,这就是问题所在。 – Alex 2010-11-08 10:25:03

1

你必须确保最后的消息也已被选中,以使该订单指挥工作\ 因此,像:

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

我认为你是在正确的方向。但它仍然返回一个错误。我会尽力找到关于“包含”方法的更多信息。 – Alex 2010-11-08 10:23:36

相关问题