【问题标题】:How to order by in Rails?如何在 Rails 中订购?
【发布时间】:2010-11-08 09:09:42
【问题描述】:

我正在开发一个小型博客引擎。

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

博客有一个外键: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...

我怎样才能让它工作?

更新

解决办法如下:

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

【问题讨论】:

  • 不起作用是什么意思?
  • @shingara,我已经更新了帖子。

标签: ruby-on-rails sql-order-by foreign-key-relationship


【解决方案1】:

我认为你的模型是错误的。请参阅 rails 自动向模型添加 2 个属性:created_atupdate_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。

【讨论】:

  • 你错过了这个问题。在 Alex 的数据模型中,他知道每个博客的最后一条消息是什么。只是为了避免这种双重消息问题。
  • 我指出它与 created_at 是重复的 - 之后,他做他想做的事。
  • 这是一个很好的观点。但问题是,我已经有了一些架构。博客 has_many :messages & Message belongs_to :blog。我也有 LAST_MESSAGE 属性,这就是问题所在。
  • blogs.joins(:last_message).order("messages.created_at DESC").
【解决方案2】:

您必须确保最后的消息也被选中以使该命令命令工作。\ 所以像:

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

【讨论】:

  • 我认为你的方向是正确的。但是它仍然返回错误。我将尝试查找有关“包含”方法的更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 2011-01-13
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多