#ruby #sinatra #sequel
#ruby #sinatra #продолжение
Вопрос:
Моя модель Article
, и я хочу отобразить только фрагмент текста статьи, чтобы дать предварительный просмотр этой конкретной статьи.
Как бы я это сделал с Sequel?
Я думал, что это может быть использование limit
, но это просто ограничивает количество записей, возвращаемых из базы данных.
В идеале я хотел бы сделать что-то вроде: Article.first.limit(40)
где 40 — это первые 40 символов.
Я знаю, limit
что это не сработает, но я просто использую это как пример, чтобы проиллюстрировать, что я ищу.
Редактировать 1:
Я использую Sinatra. Я хотел ограничить возвращаемые значения, но из представления, а не из файла маршрутизации.
Я делаю что-то подобное в файле маршрутизации:
@section = HelpSections.filter(:type => 'a').order(:sort, :name)
Который выдает мне список всех разделов типа a
.
Затем, чтобы перейти к статье, я делаю:
@section.each do |article|
article.question.each do |title|
title.name[0..9]
end
end
Основываясь на этом сценарии, то, что я хочу сделать, это ограничить размер возвращаемого атрибута ‘name’.
Но, когда я это делаю, я получаю эту ошибку:
undefined method '[]' for nil:NilClass
Как мне справиться с этим, чтобы я мог ограничить размер name
атрибута?
Комментарии:
1.Проблема в том, что title.name возвращает nil (ничего). Вы уверены, что не имели в виду что-то вроде этого:
@section.each do |article|
article.name[0..9]
2. Извините, я добавил
article.question.each do |title|
… он не должен возвращатьnil
, если он анализирует символы в статье. Если я это сделаюarticle.name
, это вернет полное значение (которое является длинным). Когда я это делаюarticle.name[0..9]
, именно тогда он жалуется, что наводит меня на мысль, что он, возможно, ищет запись в name, а не анализирует символы … если это имеет смысл.3. Попробуйте
article.name.to_s[0..9]
4. Вы можете обновить свой ответ, если хотите, чтобы более точно отразить обновленный вопрос.
Ответ №1:
Не могли бы вы просто сделать что-то вроде этого?:
Article.first[:body][0..39]
Если вам действительно нужно сделать это через SQL, вы можете сделать что-то вроде этого:
Article.select {|a| a.substr(:body, 1, 40) }
(Возможно, вам придется использовать .substring
вместо substr
в зависимости от вашей базы данных)
Комментарии:
1. Привет, Алекс … еще один вопрос… Я собираюсь обновить вопрос о том, как я могу справиться с этим в представлении.
2. Вы используете Rails? Если да, взгляните на
truncate
: apidock.com/rails/ActionView/Helpers/TextHelper/truncate