Я не думаю, что есть способ получить эти заметки одним запросом - вам понадобится как минимум два.Исходя из моего (несколько ограниченного) понимания SQL, единственный способ, которым вы должны это сделать:
- Получить 4 примечания, которые идут "до"
primary_note
- Получить 4Примечания "после"
primary_note
- Объединение двух наборов
Что-то похожее на это (предупреждение: непроверенный код)
class Note < ActiveRecord::Base
# on rails 3 I prefer class methods to named scopes.
# they are equally "chainable" and have simpler syntax
def self.notes_before(date, limit=4)
self.where(['date >= ?', date]).order("date DESC, created_at DESC").limit(limit)
end
def self.notes_after(date, limit=4)
self.where(['date <= ?', date]).order("created_at ASC, date ASC").limit(limit)
end
# Instance method
def notes_around(limit=4)
(Note.notes_before(self.date, limit) << self) + Note.notes_after(self.date, limit)
end
end
Использование:
n = Note.new(:date => Date.yesterday)
n.notes_around # returns the 9 notes around n, plus n
n.notes_around(40) # returns 81 notes
# in addition:
Note.notes_before(Date.today, 40) # last 40 notes
Note.notes_after(Date.today, 10).where(:color => 'blue') # chainable
Но я не мог придумать «цепной метод класса».Возможно, я не знаю достаточно SQL.
В идеале, 9 других заметок будут выделены как 5 до основной ноты и 4 после (или 4 до & 5 после), в зависимости от порядка впервая строка выше
Я не понимаю, как вы определяете, что вам нужно "4" или "5" в этом контексте.Поэтому я предполагаю, что вы это знаете.