Ruby on rails 如何构建一个查询来获得使用Rails添加两个模型的列的最大结果?

Ruby on rails 如何构建一个查询来获得使用Rails添加两个模型的列的最大结果?,ruby-on-rails,ruby,rails-activerecord,Ruby On Rails,Ruby,Rails Activerecord,我正在努力在Rails中构建一个查询,该查询返回两个不同表的两列相加的最大值。我有两个模型,让我们把它们命名为Audio和Property,其中Property有列id、Audio\u id、start\u at、collection\u name,Audio有id和length。我要做的是在Rails中构建以下SQL查询: SELECT MAX(property.starts_at + audio.length) FROM audio INNER JOIN property WHERE p

我正在努力在Rails中构建一个查询,该查询返回两个不同表的两列相加的最大值。我有两个模型,让我们把它们命名为Audio和Property,其中Property有列id、Audio\u id、start\u at、collection\u name,Audio有id和length。我要做的是在Rails中构建以下SQL查询:

SELECT MAX(property.starts_at + audio.length) FROM audio
  INNER JOIN property WHERE property.audio_id = audio.id
  AND property.collection_name = 'some_name';
这些关联只属于属性的:audio,并且具有多个:audio属性。我可以构建这个函数,检索集合_name为“some_name”的每个属性,迭代每个属性,将max保存到一个变量并返回max值:

def full_length
  full_lengths = []
  Property.where(:collection_name => 'some_name').each do |p|
    full_lengths << p.audio.length + p.starts_at
  end
  full_lengths.max
end

但从性能上看,这看起来并不太好,Ruby/Rails似乎也不是这样做的。是否有任何ActiveRecord方法的组合允许我这样做?

我已经找到了我想要的答案。事实证明,它可以通过链接连接来完成,最大值和位置:

属性。其中:集合\u名称=> 'some_name'。加入:audio.maximum'starts_at+length'

0.2ms从属性中选择MAXstarts_at+length作为max_id audios.id=properties.audio\u id上的内部连接audios,其中 properties.collection\u name='some\u name'

=>6038


鉴于您知道要运行的原始sql,有什么理由不这样做吗?根据API,我了解API将如何帮助我检索作为对象的完整记录。但我不确定如何使用它从不同的记录中检索处理过的数据。例如,作为First.find\u by\u SQL运行该SQL查询将返回一个空=>对象。或者我愚蠢地遗漏了什么?我建议你用一些真实的单词来代替第一,第二,这个值,那个值。太抽象了,我无法理解。好的,我会编辑它。它只能变得更容易理解我猜如果我理解正确,属性就像音频片段?如果是这样的话,那么集合\u name attr在音频中而不是在属性/片段中不是很自然吗?