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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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は、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

2回答

1298閲覧

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

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は、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿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

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

ruby

1def index 2 lower_year = params[:lowerYear].to_i 3 address = params[:address] 4 host_skill_ids = params[:skillsId].map(&:to_i) 5 6 all_users = User.includes(:user_skills) 7 8 target_users_id = [] # skillが被っていないuserのidの配列 9 10 all_users.each do |user| 11 skills = user.user_skills 12 13 user_skill_ids = [] #一人のuserが所持しているskillsのidの配列 14 15 skills.each do |skill| 16 user_skill_ids.push(skill.skill_id) 17 end 18 19 user_skill_ids.push(host_skill_ids) 20 user_skill_ids.flatten! 21 mixed_skill_ids = user_skill_ids.uniq 22 23 24 if mixed_skill_ids.length == user_skill_ids.length 25 target_users_id.push(user.id) 26 end 27 end 28 29 # logger.debug(target_users_id) => [30, 32] OK。 30 31 32 33 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) 34 35 # logger.debug(users.inspect) => [] ここで取れていない 36 # ちなみにKaminariをはずして 37# user = User.all.year_gt(lower_year).address_like(address).wanted_true.id_include(target_users_id) でも取れていないです。 38 39 @pagination = resources_with_pagination(users) 40 @users = users.as_json 41 @object = { 42 users: @users, kaminari: @pagination 43 } 44 render json: @object 45 end

ruby

1#サンプルデータ 2 3<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"> 4<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"> 5<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"> 6

ruby

1# リクエストはこんなかんじで来ています 2# parametersのnameというのは、User検索とHost検索という2種類ユーザーに対応するためです。Host検索にリクエストされた場合にparamsを受け取って使う予定でいます。 3 4 5 6Started 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 7Processing by Api::UsersController#index as HTML 8 Parameters: {"page"=>"1", "name"=>"", "address"=>"", "lowerYear"=>"0", "skillsId"=>["1", "9"]} 9

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

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

回答2

0

ベストアンサー

サンプルデータはそれが全部ですか?
だとすると ID が 30, 32, 33 しか無いので users.id IN (25, 26, 27) を満たすデータがない、 というだけのことです。
もしそれは断片だ、という場合は rails console に入って、
pp User.pluck(:id, :year, :address, :wanted)
してみてください

投稿2021/12/22 03:45

winterboum

総合スコア23347

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

IRIESS

2021/12/22 03:51

自分のなかで情報を整理するため一度すべてのUserをdestroyして新しくデータを作ったのです。。。 コマンドで [[30, 3, nil, true], [31, 3, nil, true], [32, 5, nil, true], [33, 3, nil, true]] とでました。
IRIESS

2021/12/22 03:53

SELECT `users`.* FROM `users` WHERE (year >= 0) AND (address LIKE '%%') AND `users`.`wanted` = TRUE AND `users`.`id` IN (30, 32) LIMIT 11
IRIESS

2021/12/22 03:54

新しいsqlは上記です
IRIESS

2021/12/22 03:58

addressがnilだと部分検索で引っかからないんですね。。。。
guest

0

とくにSQLは問題なさそうなので、他の原因があるのかも。
とりあえず問題を切り分けるために、実際そのSQLをSQLクライアントから実行してみては?

投稿2021/12/22 01:52

redara

総合スコア344

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

IRIESS

2021/12/22 03:10

SQLクライアント、、、 初めて聞いたので調べてきます。 ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問