Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【Rails/Heroku】開発環境と本番環境で異なるタグ検索の挙動を解決したい

解決したいこと

RailsでWebアプリを作っています。
Herokuにデプロイしていますが、開発環境と一部挙動が異なる状況です。
本番環境のアプリのログを確認していますが、なかなか読み解けずいます。
解決方法を教えてください。

発生している問題・エラー

開発環境

タグ検索機能を実装しており、開発環境ではタグに紐づいている投稿写真の検索は問題なく挙動しています。
Image from Gyazo

本番環境

一番初めに登録したタグに紐づいた写真の検索は問題なく挙動しています。
しかし、それ以外のタグでは検索結果の表示がされない挙動となってしまっています。
Image from Gyazo

Image from Gyazo

該当するソースコード・ログ

app/controllers/search_controller.rb
class SearchController < ApplicationController
  def search
    @gender = Gender.find([2, 3, 4])
    @price = Price.find([2, 3, 4, 5, 6])
    @tags = Tag.all.order('created_at DESC')
    @value = params['search']['value']
    @how = params['search']['how']
    @datas = search_for(@how, @value)
  end

  private

 --中略--

  def match_tag(value)
    Photo.where(id: PhotoTag.select(:photo_id)
    .where(tag_id: value)
    .group(:photo_id)
    .having('COUNT(DISTINCT photo_tags.tag_id) = ?', value.size))
  end

  def search_for(how, value)
    case how
    when 'match_gender'
      match_gender(value)
    when 'match_price'
      match_price(value)
    when 'match_tag'
      match_tag(value)
    else
      keyword(value)
    end
  end
end
app/views/shared/_side_nav_hrml.erb
--中略--
<% @tags.each do |tag|%>
  <%=link_to "##{tag.name}", search_search_path('search[value]': tag.id, 'search[how]': "match_tag") , class:"nav-link" %>
<% end %>

自分で試したこと

HerokuのデータベースをSQLite3から開発環境同様のPostgreSQLに変更済み。
写真投稿や性別、値段、フリーワードでの検索の機能は問題なく挙動しているため、DB設定には問題はないと考えられます。

デプロイしたアプリのログをそれぞれ、正常な挙動と異常な挙動に分けて確認しました。

データ検索している部分に注目しましたが、特にログ自体に問題はないように自分には思えてしまい、現在に至っています。

  • 本番環境で正常に挙動した時のログ
    Image from Gyazo

  • 本番環境で異常な挙動をした時のログ
    Image from Gyazo

部分的にログを切り取ってしまっているため分かりにくいですが、この状態が3日間続いているので助けを求めています。
どうかよろしくお願いします。

0

1Answer

match_tag(value) で絞り込みに使われている .having('COUNT(DISTINCT photo_tags.tag_id) = ?', value.size)) ですが、ここで value.size を使うのはおかしいです。

value には params['search']['value'] で受け取ったパラメータが入っています。これはタグ ID の数字を文字列で表したものです。value.size はその文字列の長さです。つまりそこの .hanving は 「.group(:photo_id) でまとめた各グループについて 、異なるタグがちょうど《タグ ID の文字列長》個ついた PhotoTag に絞り込む」という意味になります。

正常な挙動をしたログでは params['search']['value']"5"、 異常な方では "65" になっていますね。タグ ID の文字列長が1のとき偶然意図と同じ挙動になるということでしょう。

0Like

Comments

  1. @kyooooonaka

    Questioner

    ありがとうございます!
    下記コードを削除して挙動を確認したところ、正常にタグ検索ができました。

    ```
    .having('COUNT(DISTINCT photo_tags.tag_id) = ?', value.size))
    ```
    ネットから探してきたコードもしっかり理解した上で、記述しないといけないと反省しました。

Your answer might help someone💌