Rails + MySQL
Rails APIモードにて、フロント側にparamsで検索したレコードの一部を渡したいと思っています。
下記のようなusersテーブルとします。paramsはaccount_name: taro を元に検索を行います。
|id|name|nickname|email|password_digest|photo|
|:--|:--:|--:|
|1|taro|tarota|test1@gmail.com|test12345|~~~.s3.com|
|2|jiro|jiroro|test2@gmail.com|test12345|~~~.s3.com|
|3|saburo|sabusab|test3@gmail.com|test12345|~~~.s3.com|
find_byの場合
ruby
1 @user = User.find_by(account_name: params[:account_name]) 2 3 if @user.present? 4 render json: { message:"ユーザーはいます。", name: @user.name, email: @user.email } 5 else 6 render json: { message: "ユーザーはいません。"} 7 end
1, account_nameを元に検索を行なっており、一致したユーザーのレコードを取得するというのが特徴だとは思いますが、
実際にフロント側に渡したいデータはnameとemailのみになります。
その場合、一旦取得(find_by)の時点で、SQL側から返ってくるのは暗号化されたパスワードなど全て取得できてしまうので、セキュリティ的に大丈夫かどうかが気になりました。
whereの場合
ruby
1 @user = User.where(account_name: params[:account_name]).select(:name, email) 2 3 if @user.present? 4 render json: { message:"ユーザーはいます。", name: @user[0].name, email: @user[0].email } 5 else 6 render json: { message: "ユーザーはいません。"} 7 end
2, whereとselectを組み合わせれば、検索するときにselectで取得するカラムを制限しているので、
@userに入るのは、nameとemailのみです。
まとめ
1,2が質問の内容ですが、要するに
クエリを投げるときに最終的に必要なデータを絞ってから送るか(whereとselect) or find_byで一致するけど、最終的にJsonで渡すときに成形をすればいいのか
ということになります。
セキュリティ的な観点からが気になります。もしどちらでもいいのであれば、find_byのほうが楽な気がしました。
宜しくお願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/08 15:52