2017-06-05 55 views
0

我有这项工作的第一部分。我可以成功调用最近List本:Rails范围为排序最新的孩子,并包括那些没有孩子

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,它不会返回。

我的问题是,我怎么能返回由他们最近的儿童(chat_lines)排序的所有List的,即使他们没有孩子。

+0

如果列表中没有chat_lines,你会寻找什么字段? –

+0

@MichaelGorman如果'list'没有孩子,我会查找'lists.created_at'。 – Trip

回答

1

RAILS连接方法执行内部连接(两个表中都有匹配的记录)。您正在寻找的是左外部加入调用(第一个表中可能有第二个记录的记录)。在导轨5 left_outer_joins做这种类型的呼叫,在轨道4,5和下面你必须做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

对于轨道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 
+0

这看起来像是正确的答案,但我得到了一个'未定义的方法'。我在Rails 4.0上。这是Rails 5吗? – Trip

+0

它看起来像是一个rails 5的东西,对于rails 4,你只需要在你的连接调用中显式加入''join('LEFT OUTER JOIN“chat_lines”ON“chat_lines”。“list_id”=“list”。“ ID“')' –

+0

啊,这是一个好主意。尽管如此,加上我的'.where'查询似乎仍然只返回带有子节点的记录。我可能应该重新考虑我的'select'语句。我觉得这就是排除行 – Trip