如何在Rails中订购?
我正在开发一个小型博客引擎。
有以下表格:博客和消息。
Blog有一个外键:last_message_id,所以我通过调用blog.last_message访问博客中的最后一条消息
我有以下代码使它工作:
class Blog "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").
我认为你的模型是错误的。 请参阅rails自动向模型添加2个属性: created_at
和update_at
。 因此,拥有像你描述的关系是一种愚蠢的态度。 对我来说,它应该是这样的:
#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。
您必须确保还选择了最后一条消息,以使该命令命令正常工作。\所以类似于:
blogs.includes(:last_message).order("last_message.created_at desc")