Выберите 7 элементов с идентификаторами, центрированными на id 'n' - PullRequest
1 голос
/ 14 сентября 2011

Для набора Foobars со следующими идентификаторами:

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

Мне нужен способ вернуть Foobars со следующими идентификаторами на основе ActiveRecord:

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 (без Arel). Это невозможно сделать, просто вычтя и добавив 3 из идентификатора n, потому что в идентификаторах могут быть пробелы.

edit: Вот что я сделал в итоге:

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 ]

2 голосов
/ 14 сентября 2011

Попробуйте:

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

ИЛИ

Foo.find(9).snow_white_and_six_dwarfs
0 голосов
/ 14 сентября 2011

не знаю, есть ли лучший способ, но вы всегда можете сделать что-то вроде этого:

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

таким образом, вы используете индекс отсортированных идентификаторов вместо самих идентификаторов. Будьте осторожны, если ваш центральный индекс меньше 3, у вас будут отрицательные индексы, поэтому он будет выбирать идентификаторы из конца массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...