ActiveRecord查找 - 跳过记录或获取每个N记录

Col*_*say 6 sql activerecord ruby-on-rails

我想做一个查询,我选择了一堆数据,但是我希望能够通过仅选择每三个记录,甚至每百个记录来降低该数据的分辨率,或者随你.

使用ActiveRecord有什么简单的方法吗?

jig*_*fox 5

如果你的模型有一个升序行id而不丢失任何数字,你可以这样做:

Model.all(:condition => "models.id%3=0")
Run Code Online (Sandbox Code Playgroud)

如果没有,您可以先从数据库中获取所有行,然后您可以这样做:

models = Model.all
third_models = models.reject{ |model| models.index(model) % 3 != 0 }
Run Code Online (Sandbox Code Playgroud)


nat*_*vda 1

在 Oracle 中我会这样写:

YourModel.find(:conditions => 'MOD(ROWNUM,3) = 0') 
Run Code Online (Sandbox Code Playgroud)

这样做的优点是过滤器发生在数据库中,因此不会检索所有内容。

在 PostgreSQL 中,这被称为ROW_NUMBER(实际上这是 SQL 标准)。在 MySQL 中,这是不支持的。

在 mysql 中,你可以使用 来模拟 rownum SELECT @rownum:=@rownum+1 rownum, t.* FROM (SELECT @rownum:=0) r, mytable t;。所以我想像

Bar.find_by_sql("select * from (SELECT @rownum:=@rownum+1 rownum, t.* FROM (SELECT @rownum:=0) r, mytable t) where mod(rownum,3) = 0") 
Run Code Online (Sandbox Code Playgroud)

应该管用。