我如何获得这个复杂的查询?

Mat*_*man 7 activerecord ruby-on-rails

company has_many customers
customer has_many messages
customer belongs_to company
company has_many messages
message belongs_to company
message belongs_to customer
Run Code Online (Sandbox Code Playgroud)

可以从"方向"列"发送"或"接收"消息.

我想要找到的是每天"对话"的数量,其中对话被定义为客户在一天内发送至少一条消息并接收至少一条消息(不必按此顺序),除以付费公司的数量.

如何在活动记录中获得该信息?

moh*_*a27 8

让我们将查询分成几部分:

1.您需要在同一公司ID上加入消息表.

Message.joins("LEFT JOIN messages AS m ON messages.company_id = m.company_id")
Run Code Online (Sandbox Code Playgroud)

2.如果两条已加入的消息的客户相同,则会在同一天收到消息并收到m

.where("messages.direction = 'sent' AND m.direction = 'received' AND messages.customer_id = m.customer_id AND DATE(messages.created_at) = DATE(m.created_at)")
Run Code Online (Sandbox Code Playgroud)

3.您需要每天向每个客户发送和接收来自同一公司的uniq消息.

.select(" DISTINCT (messages.customer_id, messages.company_id, DATE(messages.created_at) )")
Run Code Online (Sandbox Code Playgroud)

4.按创建日期计算分组

.group('Date(messages.created_at)').count
Run Code Online (Sandbox Code Playgroud)

最终查询:

Message.joins("LEFT JOIN messages AS m ON messages.company_id = m.company_id").where("messages.direction = 'sent' AND m.direction = 'received' AND messages.customer_id = m.customer_id AND DATE(messages.created_at) = DATE(m.created_at)").select(" DISTINCT (messages.customer_id, messages.company_id, DATE(messages.created_at) )").group('Date(messages.created_at)').count
Run Code Online (Sandbox Code Playgroud)