Поиск следующей записи в базе данных с помощью Active Record - PullRequest
2 голосов
/ 20 ноября 2011

Итак, у меня есть приложение rails, и в моем приложении есть записи в блоге. Для начала я на рельсах 2.3.5 и Ruby 1.8.7

Для страницы показа мне необходимо дать ссылку предыдущая / следующая на предыдущую / следующую запись в блоге.

Загвоздка в том, что мне нужно найти следующий блог, где языковая колонка в базе данных равна 'eng'. Я начал записывать это в моей модели, и она работает, но, конечно, это просто найдет предыдущую / следующую запись в базе данных, независимо от того, какой язык указан в столбце, и она сломается, когда запись не будет найдена.

def next(lang='eng')
 BlogEntry.find(self.id - 1)
end

def prev(lang='eng')
 BlogEntry.find(self.id + 1)
end

Ответы [ 2 ]

4 голосов
/ 20 ноября 2011

Попробуй это.Это не побьет пропущенные записи.

BlogEntry.find(:first, :conditions => ["id > ? AND lang = ?", self.id, lang])

и

BlogEntry.find(:first, :conditions => ["id < ? AND lang = ?", self.id, lang])
1 голос
/ 20 ноября 2011

Подобную математику вообще опасно делать, потому что вы не можете гарантировать, что она существует. Например, предположим, что у вас есть записи с идентификаторами 1, 2 и 3, затем вы удаляете запись 3, но создаете новую запись, ActiveRecord назначит ей значение 4 (даже если 3 больше не является записью. Поэтому, если вы должны были сделать найти (self.id + 1) в записи 2, вы получите ошибку.

Самый простой способ сделать это, вероятно, с помощью оператора 'where'.

def next(lang='eng')
    BlogEntry.where(:lang => lang).where("id > ?", self.id).first
end

и

def prev(lang='eng')
    BlogEntry.where(:lang => lang).where("id < ?", self.id).last
end

Я не знаком с синтаксисом используемой вами версии Rails, но, вероятно, он очень похож, если не совпадает.

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