Как мне ограничить количество символов, возвращаемых из запроса с использованием Sequel и Ruby?

#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