对于具有以下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'
答案 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。