mysql - Rails 计算 has_many 关系并按子模型中的另一个字段分组

标签 mysql ruby-on-rails count group-by has-many

考虑这个设置

class Device
  has_many :job_transactions
end

class JobTransaction
  belongs_to :device
  # relevant attributes
  # sequential_id ( each transaction gets a sequential if using Sequenced Gem)
  # station - work station ( let say a total of 10) 
  # station is an enum


end

每个作业都有多个事务,每个事务完成后,从一个站点移动到另一个站点(它们可以多次移动到不同甚至相同的事务)

我想用最高的顺序 id 计算出此时每个站有多少工作(单元)。

所以结果应该是

{
"Station 1" => 500,
"Station 2" => 123,
etc..
} 

我的问题是确保我只计算每台设备的最新交易,而不是第 1 台或其他设备。因为我需要弄清楚目前每个站点有多少设备。

更新:

本质上我想优化这段肮脏的代码:

 has_one :latest_transaction, -> { order sequential_id: :desc }, 
          class_name: 'JobTransaction', 
          foreign_key: 'job_id'


h = Device.joins(:job_transactions).
            map{|l| l.latest_transaction.station}.
            reduce(Hash.new(0)) { |a, b| a[b] += 1; a };

更新 2

这是一个更快的解决方案,但我仍在寻找 SQL 解决方案

JobTransaction.select('job_id, station, sequential_id').
               group_by(&:job_id).
               reduce(Hash.new(0)) { |a, b| a[b.last.last.station] += 1; a }

最佳答案

你能不能:

#app/models/device.rb
class Device < ActiveRecord::Base
   has_many :job_transactions
   scope :count_transactions, -> { joins(:job_transacations).group(:job_id).count }
end

我没有得到这个要求:

I only count latest transaction for each device

也许如果你澄清一下,我们就能解决问题?

关于mysql - Rails 计算 has_many 关系并按子模型中的另一个字段分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33531537/

相关文章:

ruby-on-rails - 无法使用带有 Rails 4 的生产设备登录

ruby-on-rails - App Engine Cron 作业始终返回 HTTP 状态代码 301

sql - TSQL 计数不同

SQL,从 0 到 10

mysql - 批量插入resque

mysql - 枚举 ('active' ,'inactive' ) 与枚举(0,1)

ruby-on-rails - rake 测试和 test_structure.sql

sql - 查找满足条件但不四舍五入的行的百分比

excel - 计算单个单元格中的数字数量

mysql - 我应该在这里使用什么样的 JOIN ?