考虑这个设置
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/