相关疑难解决方法(0)

选择随机行PostgreSQL的最佳方法

我想在PostgreSQL中随机选择一行,我试过这个:

select * from table where random() < 0.01;
Run Code Online (Sandbox Code Playgroud)

但其他一些人推荐这个:

select * from table order by random() limit 1000;
Run Code Online (Sandbox Code Playgroud)

我有一个非常大的表,有5亿行,我希望它快.

哪种方法更好?有什么区别?选择随机行的最佳方法是什么?

sql random postgresql performance

311
推荐指数
9
解决办法
19万
查看次数

ActiveRecord中的随机记录

我需要通过ActiveRecord从表中获取随机记录.我从2006年开始跟随Jamis Buck的例子.

但是,我也通过Google搜索遇到了另一种方式(由于新的用户限制,无法使用链接进行归因):

 rand_id = rand(Model.count)
 rand_record = Model.first(:conditions => ["id >= ?", rand_id])
Run Code Online (Sandbox Code Playgroud)

我很好奇这里的其他人是如何做到的,或者是否有人知道哪种方式会更有效率.

random ruby-on-rails rails-activerecord

147
推荐指数
11
解决办法
8万
查看次数

清洁方式按指定的顺序按ID查找ActiveRecord对象

我想获得一个给定一组id的ActiveRecord对象数组.

我认为

Object.find([5,2,3])
Run Code Online (Sandbox Code Playgroud)

将返回一个数组,其中包含对象5,对象2,然后按顺序返回对象3,但我得到的数组按对象2,对象3和对象5排序.

ActiveRecord Base 查找方法API提到您不应该按照提供的顺序期望它(其他文档不提供此警告).

一个可能的解决方案是按相同顺序的ID数组查找的?,但订单选项似乎对SQLite无效.

我可以编写一些ruby代码来自己对对象进行排序(有点简单,缩放比例较差或缩放比较复杂),但是有更好的方法吗?

sqlite activerecord ruby-on-rails find rails-activerecord

26
推荐指数
4
解决办法
2万
查看次数

Rails 5.2:使用非属性参数调用的危险查询方法(其参数用作原始 SQL 的方法)

我有一个模型的范围,看起来像这样:

scope :indexed_by_array, lambda { |ids|
  order = sanitize_sql_array(
    ["position((',' || id::text || ',') in ?)", ids.join(',') + ',']
  )
  where(id: ids).order(order)
}
Run Code Online (Sandbox Code Playgroud)

升级到 Rails 5.2 后,它会收到大量弃用警告,例如:

使用非属性参数调用的危险查询方法(其参数用作原始 SQL 的方法):“position((',' || id::text || ',') in ',')”。Rails 6.0 中将不允许使用非属性参数。不应使用用户提供的值调用此方法,例如请求参数或模型属性。可以通过将已知安全值包装在 Arel.sql() 中来传递它们。

如何更改该范围以使用 Rails 5.2 打球?

ruby-on-rails rails-activerecord ruby-on-rails-5.2

5
推荐指数
0
解决办法
3166
查看次数