ActiveRecord查找 – 跳过记录或获取每个第N条记录
我想在一个查询中选择一堆数据,但我希望能够通过仅选择每三个记录,甚至每百个记录来降低该数据的分辨率,或者随你。
使用ActiveRecord有什么简单的方法吗?
在Oracle中我会写如下:
YourModel.find(:conditions => 'MOD(ROWNUM,3) = 0')
这样做的好处是filter发生在数据库中,因此不会检索所有内容。
在PostgreSQL中,这称为ROW_NUMBER
(实际上这是SQL标准)。 在MySQL中,这不受支持。
在mysql中,你可以使用SELECT @rownum:=@rownum+1 rownum, t.* FROM (SELECT @rownum:=0) r, mytable t;
来模仿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")
应该管用。
如果您的模型具有像id
这样的升序行而没有遗漏任何数字,您可以执行以下操作:
Model.all(:condition => "models.id%3=0")
如果没有,您可以先从数据库中获取所有行,然后您可以这样做:
models = Model.all third_models = models.reject{ |model| models.index(model) % 3 != 0 }