Rails ActiveRecord仅与选择具有最后一个id的项目连接

时间:2012-04-24 19:54:33

标签: ruby-on-rails activerecord join

我有2个型号,Video和ZencoderJob。每个视频has_many zencoder_jobs和zencoder_job belongs_to一个视频。

现在因为视频可以有多个作业(例如,当您更改视频文件时它将生成新的编码作业),有许多作业具有不同的编码状态。我使用“处理”和“完成”来了解视频何时可以通过API显示。

这是我从video.rb

的实际查询
def self.finished_and_active(limit, offset)
  limit(limit || 30)
  .offset(offset.to_i || 0)
  .order("id DESC")
  .where(:active => true)
  .joins(:zencoder_jobs).where(:zencoder_jobs => { :encoded_state => "finished" })
  .uniq
end

问题是如果一个视频有3个作业,2个旧作业和1个新作业,旧作业的编码状态为“已完成”,而新作业则为“处理”。它不会查找作业的最后一个ID,但如果有任何作业,无论是旧的还是新的“已完成”,它都会将其显示给API。

我试过

.joins(:zencoder_jobs).where(:zencoder_jobs => { :encoded_state => "finished" }).last.uniq

但由于“最后”而引发错误。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可以通过使用一些SQL魔法解决此问题。在where部分中,插入selecf max(zencoder_jobs.id) from zencoder_jobs where id = zencoder_jobs_id) = zencoder_jobs_id

答案 1 :(得分:0)

您可以尝试使用加入.Ex

的附加选项
Video.joins('LEFT JOIN zencoder_jobs ON  zencoder_jobs.video_id = video.id AND zencoder_jobs.encoded_state = "finished" ')

这将为您提供视频集合,并且需要加入zencoder_jobs