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

时间:2010-06-30 08:20:42

标签: sql ruby-on-rails activerecord

我想查询一下我选择一堆数据,但我希望能够通过仅选择每三个记录,甚至每百分之一来降低该数据的分辨率记录,或其他什么。

使用ActiveRecord有没有直接的方法?

2 个答案:

答案 0 :(得分:5)

如果您的模型有一个像id这样的升序行而没有遗漏任何数字,您可以执行以下操作:

Model.all(:condition => "models.id%3=0")

如果没有,您可以先从数据库中获取所有行,然后就可以执行此操作:

models = Model.all
third_models = models.reject{ |model| models.index(model) % 3 != 0 }

答案 1 :(得分:1)

在Oracle中我会写如下:

YourModel.find(:conditions => 'MOD(ROWNUM,3) = 0') 

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

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

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

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

应该有用。