选择7项ID为id'n'的ID

时间:2011-09-14 16:26:00

标签: ruby-on-rails

对于具有以下ID的Foobars集:

1  2  3   5  7   9  11  15  18  19  22 23

基于ActiveRecord,我需要一种方法来返回带有以下ID的Foobars:

baz(1) -> 1 2 3 5 7 9 11

baz(9) -> 3 5 7 9 11 15 18

baz(22) -> 9 11 15 18 19 22 23

这必须与Ruby on Rails 2.3.9(no Arel)兼容。它不能通过简单地从id n中减去和添加3来完成,因为ID中可能存在间隙。

编辑:这是我最后所做的:

firstseg = Foobar.all(:conditions => ["id <= " + params[:id]],
    :limit=> 4, :order => "id desc").reverse

@Foobars = firstseg + Foobars.all(:conditions => ["id > " + params[:id]],
    :limit => (7 - firstseg.length).to_s, :order => "id asc")

render 'showthem'

2 个答案:

答案 0 :(得分:2)

试试这个:

class Foo
  def snow_white_and_six_dwarfs
    [ 
      Foo.all(:conditions => ["id < ?", id], :limit => 3, :order => "id ASC"),
      self,
      Foo.all(:conditions => ["id > ?", id], :limit => 3, :order => "id ASC")
    ].flatten
  end
end

现在

foo.snow_white_and_six_dwarfs

OR

Foo.find(9).snow_white_and_six_dwarfs

答案 1 :(得分:0)

不知道是否有更好的方法,但你可以做到这样的事情:

def baz center_id
  all_ids = Foobar.find(:all, :select => "id", :order => "id ASC").collect &:id
  center_index = center_id ? all_ids.index(center_id) : nil

  if center_index
    Foobar.find(all_ids[center_index-3..center_index+3])
  else
    []
  end
end

这样,您可以使用已排序的ID的索引而不是ID本身。但是要小心,如果你的中心索引小于3,你将有负索引,所以它会从数组的末尾选择id。