Sql Rails用于对最近的子项进行排序,包括那些没有子项的子项

Sql Rails用于对最近的子项进行排序,包括那些没有子项的子项,sql,ruby-on-rails,postgresql,Sql,Ruby On Rails,Postgresql,我有这个工作的第一部分。我可以使用以下命令成功调用最近的列表: scope :most_recent_chats, -> { where(list_type: 'my').joins(:chat_lines) .where('chat_lines.created_at = (SELECT MAX(chat_lines.created_at) FROM chat_lines where chat_lines.list_id = lists.id)') .group('lists

我有这个工作的第一部分。我可以使用以下命令成功调用最近的列表:

scope :most_recent_chats, -> { 
  where(list_type: 'my').joins(:chat_lines)
  .where('chat_lines.created_at = (SELECT MAX(chat_lines.created_at) FROM chat_lines where chat_lines.list_id = lists.id)')
  .group('lists.id')
}
但是,如果列表没有聊天线路,则不会返回


我的问题是,即使没有子项,我如何返回所有按其最近的子项聊天行排序的列表。

RAILS joins方法执行一个内部连接,将两个表中的记录进行匹配。您要查找的是第一个表中的左外部连接调用记录,而第二个表中可能有记录。在rails 5中,left_outer_joins执行这种类型的调用,在rails 4和更低版本中,您必须通过执行join“在chat_lines.list_id=list.id上执行left-outer join chat_lines”来明确表示

有关不同类型联接调用的更多信息,请转到

有关Rails连接方法的详细信息

轨道4

where(list_type: 'my').join('LEFT OUTER JOIN "chat_lines" ON "chat_lines"."list_id" = "list"."id"')
  .order("GREATEST(chat_lines.created_at, list.created_at) DESC").limit(1).first
轨道5

where(list_type: 'my').left_outer_joins(:chat_lines)
  .order("GREATEST(chat_lines.created_at, list.created_at) DESC").limit(1).first

如果列表没有聊天行,你会查找哪个字段?@MichaelGorman我会查找列表。如果列表没有子项,则创建。这似乎是正确答案,但我得到了一个未定义的方法。我在Rails 4.0上。这是Rails 5吗?它看起来像是Rails 5的东西,对于Rails 4,你只需要在你的连接调用中显式地加入'LEFT OUTER join chat_lines ON chat_lines.list_id=list.id'啊,这是个好主意。尽管如此,再加上我的.where查询似乎仍然只返回带有子项的记录。我可能应该重新考虑我的select语句。我觉得这是排他性的一行。您可能可以使用MYSQL GREATER方法将在处创建的列表与在处创建的chat_行进行比较,并根据结果进行排序