super-appy / itsumono_obento

今ある材料で作れるレシピを提案するAIレシピとお弁当カレンダー機能で、お弁当作りをサポートするアプリ
6 stars 0 forks source link

投稿のレコメンド #147

Closed super-appy closed 8 months ago

super-appy commented 8 months ago

https://miro.com/welcomeonboard/clRZTEVTNUlHbGpvSzNZOFRWdmV5cFJSdkdSRlF3a0h5bk1XWUZEZW83V0pkVnlPY0w3aWdjNHBCNzJoRWJqb3wzNDU4NzY0NTc2NDkyNzcxMDY2fDI=?share_link_id=349522241363

super-appy commented 8 months ago
super-appy commented 8 months ago

検索条件を使ってレシピを検索するには、ransack などの検索メソッドを使用する必要があります。ただし、user_search_logs から取得した search_params は文字列化されている可能性があるため、適切にハッシュに変換する必要があります。

以下に、search_params を使用してレシピを検索する方法の例を示します。

# UserSearchLog から search_params を取得し、適切な形式に変換
search_params = current_user.user_search_logs.find(11).search_params
search_params = eval(search_params) # JSON文字列をRubyのハッシュに変換

# Ransackを使用して検索条件に基づいてレシピを検索
@q = Recipe.ransack(search_params)
@recipes = @q.result

ここで、eval メソッドを使用していますが、これはセキュリティ上のリスクを伴うため、信頼できるデータにのみ使用してください。より安全な方法は、search_params をJSONとして保存し、JSONをハッシュにパースする方法です。たとえば、search_params がJSON文字列であれば、以下のように変換できます。

search_params = JSON.parse(current_user.user_search_logs.find(11).search_params)
@q = Recipe.ransack(search_params)
@recipes = @q.result

これにより、user_search_logs に保存された検索条件を使用してレシピを検索することができます。

super-appy commented 8 months ago

後者を使うならJSON形式でデータを保存しないといけない

      current_user.user_search_logs.create!(search_params: (params[:q].to_json))
super-appy commented 8 months ago

JSON.generateto_json の違いは微妙ですが、特にRuby on Railsのコンテキストでは重要な違いがあります。

  1. JSON.generate:

    • これはRubyの標準ライブラリの一部である json モジュールによって提供されます。
    • オブジェクトをJSON文字列に変換するために使用されますが、このメソッドは主にハッシュや配列などの基本的なRubyオブジェクトに対して使われます。
    • JSON.generate は、オブジェクトが複雑な構造(例えば、ネストされたオブジェクトやカスタムオブジェクト)を持っている場合、それを適切に扱うことができない場合があります。
  2. to_json:

    • これはRails(ActiveSupportの一部)によって提供されるメソッドで、RubyオブジェクトをJSON文字列に変換します。
    • to_jsonJSON.generate よりも柔軟であり、Railsのモデルや他の複雑なオブジェクトを含む、より多様なオブジェクトタイプを適切に処理できます。
    • たとえば、Active Recordオブジェクトの場合、to_json は関連する属性だけでなく、関連するオブジェクトやメソッドの結果など、より詳細な情報をJSON形式に変換することができます。

あなたのケースで JSON.generate(params[:q]) がうまく機能しなかった理由は、params[:q]ActionController::Parameters オブジェクトであった可能性があります。このオブジェクトはハッシュのように振る舞いますが、実際にはハッシュではなく、JSON.generate はそれを正しく変換できなかったのかもしれません。to_json を使うと、ActionController::Parameters オブジェクトが内部的にハッシュに変換され、その後JSON文字列に適切に変換されるため、期待通りの結果を得られます。

super-appy commented 8 months ago

Railsコンソールを使用してデータを削除するにはいくつかの方法があります。どの方法を使用するかは、削除したいデータの種類と量によって異なります。

特定のレコードの削除

特定のレコードを削除するには、まずそのレコードを見つけてから削除します。例えば、IDを使って特定のユーザーを削除するには:

user = User.find(1) # IDが1のユーザーを見つける
user.destroy # ユーザーを削除

複数のレコードの削除

複数のレコードを削除するには、where クエリを使って条件に合うレコードを見つけ、それらを削除します:

User.where(age: 20).destroy_all # 年齢が20のすべてのユーザーを削除

全てのレコードの削除

あるモデルの全てのレコードを削除するには、destroy_all メソッドを使用します:

User.destroy_all # Userモデルの全てのレコードを削除

注意事項

データを削除する前に、削除することによって生じる影響を十分に理解しておくことが重要です。特に、本番環境のデータを扱う場合は慎重に行ってください。

super-appy commented 8 months ago

rejectを使って配列を書き換える:https://www.sejuku.net/blog/70603

  1. ブックマークしているレシピのidの配列を取得する

    bookmarked_recipe_ids = current_user.bookmarked_recipes.pluck(:recipe_id)
  2. 取り出した配列からブックマークされているものは取り除いて表示する

    @recommended_recipes = q.result.reject { |recipe| bookmarked_recipe_ids.include?(recipe.id)}