我想在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亿行,我希望它快.
哪种方法更好?有什么区别?选择随机行的最佳方法是什么?
我需要通过ActiveRecord从表中获取随机记录.我从2006年开始跟随Jamis Buck的例子.
但是,我也通过Google搜索遇到了另一种方式(由于新的用户限制,无法使用链接进行归因):
rand_id = rand(Model.count)
rand_record = Model.first(:conditions => ["id >= ?", rand_id])
Run Code Online (Sandbox Code Playgroud)
我很好奇这里的其他人是如何做到的,或者是否有人知道哪种方式会更有效率.
我想获得一个给定一组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代码来自己对对象进行排序(有点简单,缩放比例较差或缩放比较复杂),但是有更好的方法吗?
我有一个模型的范围,看起来像这样:
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 打球?