如何在RoR中用单行代码实现按ID筛选或全量统计查询
Ruby on Rails 单行实现动态筛选与时间差求和
直接利用 Rails where 方法的特性就能实现,不需要用 'all' 这种占位符:
tracks.where(video_id: ids).sum("EXTRACT(EPOCH FROM (updated_at - created_at))")
细节说明:
- 当
ids不为nil且非空时,where(video_id: ids)会生成筛选video_id匹配值的 SQL 语句; - 当
ids是nil或者空数组时,where会自动忽略这个条件,直接返回所有记录; - 时间差计算注意数据库兼容性:
age函数并非所有数据库都支持,PostgreSQL 可以用EXTRACT(EPOCH FROM (updated_at - created_at))获取秒级时间差,MySQL 则用TIMESTAMPDIFF(SECOND, created_at, updated_at),根据你的数据库类型调整即可。
如果想更明确地处理 nil 判断,也可以写成:
tracks.where(ids.present? ? { video_id: ids } : nil).sum("TIMESTAMPDIFF(SECOND, created_at, updated_at)")
内容的提问来源于stack exchange,提问作者kostyaha
相关产品推荐
相关产品推荐

