From d79a51f30cd1696bec29482d26e0d7f472371697 Mon Sep 17 00:00:00 2001 From: Kazuyoshi Kato Date: Wed, 9 Oct 2024 21:13:50 -0700 Subject: [PATCH 1/2] Add a search form --- app/controllers/messages_controller.rb | 35 ++++++++++++++++----- app/views/messages/index.html.erb | 43 +++++++++++++++++++------- 2 files changed, 58 insertions(+), 20 deletions(-) diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index 212a1e8..e2477a2 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -1,17 +1,25 @@ class MessagesController < ApplicationController + PER_PAGE = 50 + # GET /messages or /messages.json def index query = params[:q] - if query - # %> and <-> are defined by pg_trgm. - # https://www.postgresql.org/docs/17/pgtrgm.html - @messages = Message.find_by_sql([ - 'SELECT * FROM messages WHERE body %> ? ORDER BY body <-> ? LIMIT 20', - query, query, - ]) + unless query + @messages = [] + return + end + + page = params[:page].to_i + list_ids = get_list_ids(params) + + # %> and <-> are defined by pg_trgm. + # https://www.postgresql.org/docs/17/pgtrgm.html + message_where = if Rails.env.production? + Message.where('body %> ? AND list_id IN (?) ORDER BY body <-> ?', query, list_ids, query) else - @messages = Message.all + Message.where('body LIKE ? AND list_id IN (?)', "%#{query}%", list_ids) end + @messages = message_where.offset(page * PER_PAGE).limit(PER_PAGE) end # GET /messages/1 or /messages/1.json @@ -23,4 +31,15 @@ def show @message = Message.find_by(list_id: list.id, list_seq: params[:list_seq]) end end + + private + def get_list_ids(params) + list_ids = [] + ['ruby-talk', 'ruby-core', 'ruby-list', 'ruby-dev'].each do |name| + if params[name.tr('-', '_').to_sym] == '1' + list_ids << List.find_by_name(name).id + end + end + list_ids + end end diff --git a/app/views/messages/index.html.erb b/app/views/messages/index.html.erb index 66cae3a..35e0de2 100644 --- a/app/views/messages/index.html.erb +++ b/app/views/messages/index.html.erb @@ -1,14 +1,33 @@

<%= notice %>

-

Messages

- - +

blade.ruby-lang.org

+ +<%= form_with(method: :get) do |form| %> + <%= form.text_field :q, { value: params[:q] } %> + <%= form.submit "Search" %> + +

+ <% + [ + [:ruby_talk, 'ruby-talk (English)'], + [:ruby_core, 'ruby-core (For developing Ruby iself, English)'], + [:ruby_list, 'ruby-list (Japanese)'], + [:ruby_dev, 'ruby-dev (For developing Ruby itself, Japanese)'], + ].each do |name, label| + %> + + <%= form.check_box name, {checked: params[name] == '1' } %> + <%= form.label name, label %> + + <% end %> +

+<% end %> + +<% @messages.each do |message| %> +
+ <% list_name = List.find_by_id(message.list_id).name %> + <%= list_name %>:<%= message.list_seq %> + <%= link_to message.subject, "/#{list_name}/#{message.list_seq}" %> + <%= message.body %> +
+<% end %> From d5e38801b1a14b633d1aff16ddb57cf2b874a9be Mon Sep 17 00:00:00 2001 From: Kazuyoshi Kato Date: Wed, 9 Oct 2024 21:21:01 -0700 Subject: [PATCH 2/2] 10 is too low --- .rubocop.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index f3889e7..29d19a8 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -5,4 +5,7 @@ Layout: Enabled: false Metrics/BlockLength: - Max: 50 \ No newline at end of file + Max: 50 + +Metrics/MethodLength: + Max: 40