Rails アプリがあり、レポートを生成したい
Log、Customer、User、および Project モデルがあります。
ログはプロジェクトと顧客に属することができ、常にユーザーに属します。
レポートを生成するとき。たとえば、ユーザーを選択して、そのユーザーのすべてのログを取得できます。ユーザーとプロジェクトを選択すると、ユーザーとプロジェクトに関連付けられているログを取得したいと考えています。
これは私の最初の試みでした:
Log.where(user_id: params[:user_id],project _id: params[:project_id],customer_id: params[:customer_id]
問題は、特定のプロジェクトまたは顧客のログが必要な場合、params[:user_id] が nil であり、エラーになることです。
だから二度目の試み
class Log < ActiveRecord::Base
def self.user_try(user)
if user
where(user_id: user)
else
where("end_time IS NOT NULL")
end
end
#corresponding methods for project and customer
end
私は醜い if..else ステートメントを持たなければなりません。ユーザーが nil の場合、where("end_time IS NOT NULL")
検索は常に true であるというエラーが発生します。
発見は今このようになっています
Log.user_try(params[:user_id])
.project_try(params[:project_id])
.customer_try(params[:customer_id])
これは機能しますが、コードが本当に好きではありません。
3回目の試行は私が立ち往生している場所です
メソッドにパラメーターをハッシュとして渡すことにより、3つの「user_try」メソッドすべてで機能するメソッドを作成しようとしています。
どうやってやるの?