我有两个表/模型:
两者都有自创建时间的时间戳。
我想表明:"原因到效果后的平均时间"
要手动执行此操作,我会查看最后10-20个效果记录,然后每个我会查找比给定效果更旧的最新原因记录。然后我会平均每个时间差。
以编程方式计算此内容的最佳方法是什么?
我担心随着数据集的增长,如果我不以智能的方式设置它,这可能会变得非常昂贵。
如果它是相关的,我使用Ruby 2.x + Rails 4.2 + MySQL / SqLite3,但可接受的答案可以是通用/伪代码。换句话说,我不需要你为我编写查询。帮助我找出最聪明的设计模式。
更新
我正在研究一种受评论和第一个答案启发的方法......
我在效果表中添加last_cause
列,其中包含最新原因的ID。
答案 0 :(得分:0)
评论中鼓励的是在因果之间设置ActiveRecord association。
class Cause < ActiveRecord::Base
has_one :effect
end
class Effect < ActiveRecord::Base
belongs_to :cause
end
然后你可以做以下事情:
beer = Cause.first
beer.effect
# => Urination
和返工原因:
class Cause < ActiveRecord::Base
has_one :effect
def time_til_effect # instance method
self.effect.created_at - self.created_at
end
end
beer.time_til_effect
# => 30 minutes
然后,您可以向Cause添加一个类方法,该方法将返回原因所有实例的平均时间:
def self.average_time_til_effect # class method
cause_effect_times = Cause.all.map { |cause| cause.time_til_effect }
cause_effect_times.inject(:+) / cause_effect_times.length
end
您可以进一步向类方法添加一个参数,将其范围限制为最新的(x)原因。
在说完所有这些之后,我认为最大的收获是检查所有的ActiveRecord协会,它们非常强大并且提供了大量的实用工具。