【问题标题】:Get random records from rails 5 but keep one record(based on some value ) on top从 rails 5 获取随机记录,但在顶部保留一条记录(基于某个值)
【发布时间】:2017-06-21 06:21:37
【问题描述】:

我有一个问题表。它有一个虚拟问题,我想随机获得这个问题,但这个虚拟问题应该始终位于返回的 ActiveRecord 集合的顶部。我可以使用Random() 函数获得随机购买的记录,该函数运行良好,但该虚拟问题也有我不想要的随机位置,我希望它位于第一个位置。任何解决方案都会有所帮助。

问题表列:id, statement, answer 虚拟问题有空白陈述。

查询我正在使用

Question.all.order("Random()") 

我正在使用 PostgreSQL。

【问题讨论】:

  • 请分享问题表的表结构。以及您用来选择随机记录的查询。请不要在评论中添加它,通过编辑问题将其添加到您的问题本身中。
  • 你没有使用activerecord?
  • 是的,我正在使用它
  • 关于statement 列的“空白”具体是什么意思?空值?一个空字符串?还有什么?
  • 如果 id 是主键,那么您可以在查询中执行类似-order by id=dummy_que_id desc 的操作。

标签: sql ruby-on-rails postgresql rails-activerecord


【解决方案1】:

第一个选项:

select_clause = "(CASE WHEN (statement = '') THEN 0 ELSE Random() END) as dummy, questions.*"
Question
  .select(select_clause)
  .order('dummy')

第二个选项:

select_clause = "(statement <> '') as dummy, questions.*"
Question
  .select(select_clause)
  .order('dummy, Random()')

编辑statement 不应在两个选项中都包含 NULL

【讨论】:

  • thanx... 正是我要找的东西
  • @TasawarHussain 你必须注意:random()ORDER BY random() 在大桌子上不够快。
  • @pravel 也可以做 Question.order('statement '', Random()')
  • @TasawarHussain 是的,但是当您修改select 时,您可以选择稍后在代码中使用question_instance.dummy
猜你喜欢
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
相关资源
最近更新 更多