[RUBY] [Rails] Recherche sans distinction entre hiragana, katakana et kanji en utilisant le formulaire de recherche (la précision n'est pas de 100%)

J'ai implémenté un formulaire de recherche dans l'application que je crée en tant que PF. Cependant, si vous recherchez avec [formulaire de recherche de rails], vous trouverez de nombreuses correspondances partielles et exactes. Je me suis demandé si je pouvais d'une manière ou d'une autre rechercher la partie kanji avec hiragana ou katakana.

Le flux est que lorsque vous enregistrez le titre d'une vidéo, vous convertissez le titre en Romaji et l'enregistrez dans une colonne dédiée, et lorsque vous recherchez, vous convertissez également le mot de recherche en Romaji et vous y faites référence en tant que colonne dédiée. Au début, j'ai pensé à convertir tous les titres lors de la recherche, mais j'ai pensé que cela prendrait du temps à mesure que le nombre de vidéos augmentait, j'ai donc choisi la méthode ci-dessus.

Puisque je suis un débutant, je pense qu'il y a une partie dont je n'ai pas besoin pour faire une chose aussi redondante, mais je vais l'écrire avec le sens d'un mémorandum, alors donnez-lui un gros problème.

Site référencé

Faire un formulaire de recherche

Le formulaire de recherche lui-même contient divers articles, donc je pense qu'il est facile à créer. Dans mon cas, il s'agit d'un site de publication de vidéos. Dans la recherche, créez un formulaire de recherche dans lequel le mot recherché correspond au titre de la vidéo.

/application.html.erb


      <div id="search-box">
        <%= form_tag(search_path, :method => 'get') do %>
          <div class="input-tag">
            <%= text_field_tag :search, '', placeholder: 'Chercher', value: params[:title] %>
          </div>
          <div class="submit tag">
            <%= button_tag type: 'submit', class: 'btn btn-default' do %>
              <i class="fas fa-search"></i>
            <% end %>
          </div>
        <% end %>
      </div>

Ignorez le routage vers l'action de recherche du contrôleur de vidéos.

routes.rb


  #Fonction de recherche
  get "search" => "videos#search"

Ajouter au contrôleur

Présentez le bijou. Cette fois, j'ai utilisé une gemme appelée miyabi. C'est un joyau qui peut être converti et jugé de Hiragana à Katakana à Romaji. La méthode utilisée cette fois

.to_roman   #Convertir une chaîne en romain
.to_kanhira #Convertir les chaînes de caractères contenant des kanji en hiragana
.is_hira?   #Juger si la chaîne de caractères est hiragana
.is_kana?   #Déterminez si la chaîne de caractères est katakana

Après avoir introduit gem, nous écrirons créer et rechercher le contrôleur. Pour le modèle appelé Vidéo user_id title introduction Il existe une colonne appelée conversion_title qui enregistre le titre converti en caractères romains.

schema.rb


  create_table "videos", force: :cascade do |t|
    t.integer "user_id"
    t.string "title"
    t.text "introduction"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "conversion_title"
  end

Je crée une création de videos.controller, mais j'ai des problèmes.

Avec gem'miyabi ', vous pouvez [convertir une chaîne de caractères contenant des kanji], mais vous ne pouvez pas déterminer [si le kanji est inclus dans la chaîne de caractères].

Détermine si l'expression régulière de ruby contient des kanji. Cette fois, je veux vérifier si le kanji est inclus dans le titre, alors identifions uniquement les kanji.

@video.title.match(/[un-龠]/)

Vous pouvez maintenant déterminer si le kanji est inclus.

Enregistrez la vidéo publiée par create.

/videos_controller.rb


  def create
    @video = Video.new(video_params)
    @video.user_id = current_user.id
    if @video.title.match(/[un-龠]/)
      @video.conversion_title = @video.title.to_kanhira.to_roman
    elsif @video.title.is_hira? || @video.title.is_kana?
      @video.conversion_title = @video.title.to_roman
    else
      @video.conversion_title = @video.title
    end
    if @video.save
      redirect_to video_path(@video)
    else
      render :new
    end
  end

  private

  def video_params
    params.require(:video).permit(:title, :introduction, :video)
  end

De haut en bas, déterminez d'abord si le titre contient des kanji. S'il est inclus, convertissez le titre en Hiragana, puis convertissez-le en Romaji et enregistrez-le.

Si Kanji n'est pas inclus et que tous sont Hiragana et Katakana, ils seront convertis en Romaji et sauvegardés.

Si ni l'un ni l'autre n'est vrai, nous supposerons qu'il est affiché en caractères romains et l'enregistrerons tel quel.

J'écrirai l'action de recherche de la même manière.

/videos_controller.rb


  def search
    word = params[:search]
    unless word.blank?
      if word.match(/[un-龠]/)
        conversion_word = word.to_kanhira.to_roman
      elsif word.is_hira? || word.is_kana?
        conversion_word = word.to_roman
      else
        conversion_word = word
      end
    end
    @search_video = Video.search(conversion_word)
  end

Le mot recherché dans le formulaire est attribué à mot, et si le mot est inclus, il est converti en caractères romains. Similaire à créer, la conversion qui remplit les conditions est effectuée dans l'ordre à partir du haut. Si le mot recherché est recherché sans rien, toutes les vidéos sont renvoyées.

La vue des résultats de la recherche ressemble à ceci.

/videos/search.html.erb


<h2>Résultats de recherche</h2>

      <% unless @search_video.blank? %>
        <div class="row">
        <% @search_video.each do |video| %>
        
        =====réduction=====    
        
        <% end %>
        </div>
      <% else %>
        <p>Aucun résultat</p>
      <% end %>
  </div>

S'il n'y a pas de correspondance pour le mot recherché, ce fait est affiché. C'est tout ce qu'on peut en dire.

Achevée!

Je vais vraiment l'essayer.

スクリーンショット 2020-09-28 13.30.22.png

Entrez "Umigame" dans Hiragana

スクリーンショット 2020-09-28 13.31.12.png

Il a renvoyé une vidéo avec un titre de conversion appelé "umigame". (Il existe de nombreuses vidéos qui portent le titre de Kaigame, mais il s'agit de la vidéo avant l'ajout de conversion_title. Merci.)

Je chercherai également à Romaji.

スクリーンショット 2020-09-28 14.38.18.png

スクリーンショット 2020-09-28 14.38.33.png

Il a été affiché.

Autre

Pendant le test, si le navigateur en arrière, etc. est entré, le mouvement des paramètres peut changer, ou toutes les vidéos peuvent être lues. Peut-être que c'est de l'argent ... Je pense que je dois aussi étudier JS.

Concernant les kanji, bien que ce soit également dans le titre, il ne semble pas se convertir à 100% parfaitement. (En fait, le mot "le plus fort" a été converti en "saikiu") Je pense qu'il peut être utilisé lorsque vous souhaitez faire une petite recherche.

S'il y a un meilleur moyen, faites-le.

Recommended Posts

[Rails] Recherche sans distinction entre hiragana, katakana et kanji en utilisant le formulaire de recherche (la précision n'est pas de 100%)
[Rails] Quelle est la différence entre la redirection et le rendu?
[Rails] Quelle est la différence entre l'installation et la mise à jour du bundle?
Comment résoudre le problème lorsque la valeur n'est pas envoyée lorsque le formulaire est désactivé dans les rails et envoyé
[Java] Quelle est la différence entre form, entity et dto? [Haricot]
[Rails / Active Record] À propos de la différence entre créer et créer!
Quelle est la différence entre SimpleDateFormat et DateTimeFormatter? ??