首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails ActiveRecord仅通过选择具有最后一个id的项进行联接

Rails ActiveRecord仅通过选择具有最后一个id的项进行联接
EN

Stack Overflow用户
提问于 2012-04-25 03:54:33
回答 2查看 215关注 0票数 0

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

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

这是我从video.rb发出的实际查询

代码语言:javascript
复制
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个新作业,则旧作业的encoded_state为"finished“,新作业的encoded_state为"processing”。它不会查找作业的最后ID,但如果有任何作业,无论是旧作业还是新作业,它都会将其显示给API。

我试过了

代码语言:javascript
复制
.joins(:zencoder_jobs).where(:zencoder_jobs => { :encoded_state => "finished" }).last.uniq

但是由于"last“,它抛出了一个错误。有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2012-04-25 05:34:18

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

票数 0
EN

Stack Overflow用户

发布于 2012-04-25 05:52:17

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

代码语言:javascript
复制
Video.joins('LEFT JOIN zencoder_jobs ON  zencoder_jobs.video_id = video.id AND zencoder_jobs.encoded_state = "finished" ')

这将使您获得视频集合和所需的加入zencoder_jobs

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10305091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档