0

我有 2 个模型,Video 和 ZencoderJob。每个视频has_manyzencoder_jobs 和 zencoder_jobbelongs_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

但由于“last”而引发错误。任何想法?

4

2 回答 2

0

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

于 2012-04-24T21:34:17.793 回答
0

您可以尝试使用 join .Ex 的附加选项

Video.joins('LEFT JOIN zencoder_jobs ON  zencoder_jobs.video_id = video.id AND zencoder_jobs.encoded_state = "finished" ')

这将为您收集视频并需要加入 zencoder_jobs

于 2012-04-24T21:52:16.510 回答