質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

解決済

Rails ロジックの評価をお願いします。

IRIESS
IRIESS

総合スコア45

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

2回答

0評価

0クリップ

467閲覧

投稿2021/12/21 13:55

編集2021/12/22 03:25

Railsでsqlを発行しましたが全くデータが取れません。
どこがおかしいのでしょうか。。。

SELECT `users`.* FROM `users` WHERE (year >= 0) AND (address LIKE '%%') AND `users`.`wanted` = TRUE AND `users`.`id` IN (25, 26, 27)

取りたいデータは、
Userモデルからyearカラムが0以上且つ、addressカラムに入力されたaddress(今回の場合はなし)を一部含む且つ、wantedがtrue且つ、idが指定されたものを全て(今回の場合は25,26,27)。
です。

以下コードです。

ruby

# User.rb scope :year_gt, -> (lower_year) { where('year >= ?', lower_year) } scope :address_like, -> (address) { where('address LIKE ?', "%#{address}%") } scope :wanted_true, -> { where(wanted: true) } scope :id_include, -> (ids) { where(id: ids )}

ruby

def index lower_year = params[:lowerYear].to_i address = params[:address] host_skill_ids = params[:skillsId].map(&:to_i) all_users = User.includes(:user_skills) target_users_id = [] # skillが被っていないuserのidの配列 all_users.each do |user| skills = user.user_skills user_skill_ids = [] #一人のuserが所持しているskillsのidの配列 skills.each do |skill| user_skill_ids.push(skill.skill_id) end user_skill_ids.push(host_skill_ids) user_skill_ids.flatten! mixed_skill_ids = user_skill_ids.uniq if mixed_skill_ids.length == user_skill_ids.length target_users_id.push(user.id) end end # logger.debug(target_users_id) => [30, 32] OK。 users = Kaminari.paginate_array(User.all.year_gt(lower_year).address_like(address).wanted_true.id_include(target_users_id)).page(params[:page]).per(10) # logger.debug(users.inspect) => [] ここで取れていない # ちなみにKaminariをはずして # user = User.all.year_gt(lower_year).address_like(address).wanted_true.id_include(target_users_id) でも取れていないです。 @pagination = resources_with_pagination(users) @users = users.as_json @object = { users: @users, kaminari: @pagination } render json: @object end

ruby

#サンプルデータ <User id: 30, provider: "email", uid: "1@1.com", allow_password_change: false, name: "1", email: "1@1.com", address: nil, image: nil, wanted: true, sex: false, age: 20, year: 3, profile: nil, created_at: "2021-12-21 16:38:20", updated_at: "2021-12-21 16:38:39", myid: "1"> <User id: 32, provider: "email", uid: "3@3.com", allow_password_change: false, name: "3", email: "3@3.com", address: nil, image: nil, wanted: true, sex: false, age: 23, year: 5, profile: nil, created_at: "2021-12-21 16:40:09", updated_at: "2021-12-21 16:40:21", myid: "3"> <User id: 33, provider: "email", uid: "4@4.com", allow_password_change: false, name: "4", email: "4@4.com", address: nil, image: nil, wanted: true, sex: false, age: 30, year: 3, profile: nil, created_at: "2021-12-21 16:40:59", updated_at: "2021-12-21 16:41:14", myid: "4">

ruby

# リクエストはこんなかんじで来ています # parametersのnameというのは、User検索とHost検索という2種類ユーザーに対応するためです。Host検索にリクエストされた場合にparamsを受け取って使う予定でいます。 Started GET "/api/users?page=1&name=&address=&lowerYear=0&skillsId[]=1&skillsId[]=9" for 172.21.0.1 at 2021-12-22 02:29:28 +0000 Processing by Api::UsersController#index as HTML Parameters: {"page"=>"1", "name"=>"", "address"=>"", "lowerYear"=>"0", "skillsId"=>["1", "9"]}

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

hoshi-takanori

2021/12/21 15:12

情報が少なくてよく分かりませんが、単にあてはまるデータがないとか、ruby の書き方に問題があって意図した通りの SQL になってないとか? (address LIKE '%%' だと NULL じゃないものはすべて引っかかる気がしますが…。)
m.ts10806

2021/12/21 23:01

テーブル定義とサンプルデータを提示してください。 あと、それぞれのリクエストは来ているのでしょうか? 既に指摘されている通り提示されたものがコンソールに出て居るものなら「入力されたaddress」は来てないように見受けられます。
IRIESS

2021/12/22 03:09

コメントありがとうございます。追記しましたのでよければ目を通していただけると嬉しいです。
IRIESS

2021/12/22 03:12

apiリクエストはしっかり来ておりました
IRIESS

2021/12/22 03:59

解決しました。皆様ありがとうございました。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。