【问题标题】:Rails 4 - how to generate statistics through "joins" and "includes" commands in Activerecord?Rails 4 - 如何通过 Activerecord 中的“joins”和“includes”命令生成统计信息?
【发布时间】:2016-07-03 03:12:48
【问题描述】:

我有点坚持尝试为我的应用程序生成统计信息。应用程序的相关部分具有以下结构:

class CarRegistration < ActiveRecord::Base
  belongs_to :ride
  belongs_to :car
  ...
end

class Car < ActiveRecord::Base
  has_many :car_registration
  ...
end

class Ride < ActiveRecord::Base
  belongs_to :passenger
  belongs_to :driver
  has_many :car_registration
  ...
end

class Driver < ActiveRecord::Base
  has_many :cars
  ...
end

class Passenger < ActiveRecord::Base
  has_many :cars
  ...
end

我正在尝试获取游乐设施、顶级司机和顶级乘客的列表。我最初尝试过这样的事情:

@rides_finished = Ride.joins(:car_registration)
                      .select('rides.id')
                      .where("(car_registrations.ride_id = rides.id)                                    
                              AND rides.status = 3
                              AND rides.driver_currency = ? 
                              AND rides.passenger_currency = ?", currency, currency)
                      .distinct # against displaying one shipment multiple times

然后我尝试了:

@top_pasengers = @rides_finished.joins(:passenger)
                                .select('passengers.id, passengers.name, count(rides.passenger_id) AS count_all')
                                .where('rides.passenger_id IS NOT NULL')
                                .group('passengers.id')
                                .order('count_all DESC')
                                .limit(10)  

但是当我运行这些查询时,我得到了

Mysql2::Error: Unknown column 'count_all' in 'order clause': ...

任何帮助如何获得所需的数字?

非常感谢

【问题讨论】:

  • 是否有可能 CarRegistration → has_many → Ride?这是问题中的belongs_to,但反过来对我来说更有意义。

标签: mysql ruby-on-rails ruby join activerecord


【解决方案1】:

您的问题有点令人困惑,因为您的查询使用了Ride,但列出的模型定义中没有Ride。我只关注您列出的示例查询。

我认为从“顶级乘客”的单个查询链开始会更容易:

Passenger
  .select('passengers.*')
  .select('count(1) as ride_count')
  .joins(:rides)
  .where(rides: { status: 3,
                  driver_currency: currency,
                  passenger_currency: currency })
  .group('passengers.id')
  .order('ride_count desc')
  .limit(10)

这将为您提供 Passenger 模型的 ActiveRecord::Relation,这些模型也响应 ride_count 调用,例如你可以像这样使用它:

results.each do |p|
  puts "#{p.name}: #{p.ride_count}'
end

如果一切正常,您应该能够调整查询以获取顶级驱动程序。

要获得已完成游乐设施的列表,我建议使用单独的简单查询:

Ride.where(status: 3,
           driver_currency: currency,
           passenger_currency: currency)

如果其中任何一个产生错误,请告诉我。

【讨论】:

  • 嗨@Lucas,谢谢你的回答。我很抱歉遗漏了一部分,当我写这篇文章时,它的一部分在更新时被删除了。现在已经完成了。
  • 因为我需要在统计页面上使用关于已完成游乐设施的信息,我将它们加载到@rides_finished。然后我希望一旦我加载了游乐设施(并保存在一个变量中),我可以从那里提取其他信息——比如关于乘客和司机的信息。
  • 这适用于小型数据集,但我通常鼓励在数据库上使用查询以避免在 Rails 应用程序中将“太多”加载到内存中。我会尽快更新我的答案。
  • 我相信这个模式很复杂,但我不确定我是否能想出一个更好的......随着应用程序使用的增长,数据库中的数据量也在增长表(我们使用 MySQL)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
相关资源
最近更新 更多