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

时间:2017-06-05 12:56:35

标签: sql ruby-on-rails postgresql

我的第一部分工作。我可以通过以下方式成功拨打最近的List

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')
}

但是,如果List没有chat_lines,则不会返回。

我的问题是,如果他们最近的孩子(List)排序的所有chat_lines,即使他们没有孩子也可以归还。

1 个答案:

答案 0 :(得分:1)

RAILS连接方法执行内部连接(两个表中的匹配记录)。您正在寻找的是左外部加入呼叫(第一个表中的记录可能在第二个表中有记录)。在轨道5 left_outer_joins执行此类调用,在轨道4及以下,您必须通过执行join('LEFT OUTER JOIN "chat_lines" ON "chat_lines"."list_id" = "list"."id"')

来明确

有关不同联接类型的更多信息,请转至https://www.w3schools.com/sql/sql_join.asp

有关Rails连接方法的更多信息 http://guides.rubyonrails.org/active_record_querying.html#joining-tables

对于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

对于Rails 5

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