我的第一部分工作。我可以通过以下方式成功拨打最近的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
,即使他们没有孩子也可以归还。
答案 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