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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1142閲覧

【Ruby】データベースに値がある場合trueを返すメソッドの作成について

tomohiro2525

総合スコア12

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/04/30 07:28

編集2020/05/01 11:22

現在、シェアハウスのマッチングアプリを作成中です。
イメージとして次のような動きをします。

1募集主が同居の募集する
2他者が募集に応募する
3募集主が応募に対して、許可をする

データベースに値がある場合trueを返すメソッドの作成について教えていただきたいと思います。
find_byやwhereで値を探し出しcountでtrueやfalseを返す形のメソッドを検討しているのですが、どうしても各IDごとで返す方法がわかりませんでした。テーブルごとで返すのではなく、ID個別に値を返す方法がありましたら、ぜひご教示いただければと思います。よろしくお願いいたします。

MySQL

1mysql> select * from shares; 2+----+---------+----------+------------+---------------------+---------------------+ 3| id | user_id | house_id | ok_request | created_at | updated_at | 4+----+---------+----------+------------+---------------------+---------------------+ 5| 4 | 2 | 2 | 0 | 2020-04-08 13:44:19 | 2020-04-25 05:37:02 | 6| 7 | 1 | 4 | 0 | 2020-04-09 12:50:42 | 2020-04-22 23:06:49 | 7| 9 | 3 | 4 | 1 | 2020-04-10 12:48:52 | 2020-04-20 02:49:29 | 8| 10 | 3 | 1 | 0 | 2020-04-15 08:56:55 | 2020-04-15 08:56:55 | 9| 11 | 1 | 3 | 1 | 2020-04-16 14:48:19 | 2020-04-17 14:11:23 | 10| 12 | 2 | 5 | 0 | 2020-04-16 14:52:48 | 2020-04-20 02:35:36 | 11| 13 | 3 | 3 | 0 | 2020-04-24 14:47:55 | 2020-04-24 14:47:55 | 12| 15 | 1 | 5 | 0 | 2020-04-28 10:50:48 | 2020-04-28 10:50:48 | 13+----+---------+----------+------------+---------------------+---------------------+ 148 rows in set (0.00 sec)

●user.rb

Ruby

1class User < ApplicationRecord 2 validates :name, presence: true, length: { maximum: 50 } 3 validates :email, presence: true, length: { maximum: 255 }, 4 format: {with: /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i }, 5 uniqueness: { case_sensitive: false } 6 has_secure_password 7 8 has_many :houses #募集との紐付け 9 has_many :shares #許可テーブルとの紐付け 10 11 12 has_many :requestings, through: :shares, source: :house #リクエストしている募集の取得 13 has_many :reverses_of_share, class_name: 'Share', foreign_key: 'ok_request' #自分の募集にリクエストしてくれているユーザーへの参照 14 15 def request(house) #申請する動き 16 self.shares.find_or_create_by(house_id: house.id) 17 end 18 19 def unrequest(house) #申請を取り消す動き 20 request = self.shares.find_by(house_id: house.id) 21 request.destroy if request 22 end 23 24 def requesting?(house) #申請してるかの確認 25 self.requestings.include?(house) 26 end 27 28 #has_many :ok_requestings, through: :houses, source: :shares #許可している募集の取得 29 has_many :ok_requestings, through: :shares, :foreign_key => 'ok_request', source: :house 30 31 def ok_request?(house) #申請を許可してるかの確認 32 self.ok_requestings.include?(house) 33 end 34 35 def permitted_appliments?(house) #申請を許可してるかの確認 36 return self.shares.where(ok_request: 1) 37 end 38 39 40 def permit_share?(house) #申請を許可してるかの確認 41 count = self.shares.where(ok_request: 1).count 42 return resurt = count > 0 43 end 44 45 def permit_share?(zero="0") #申請を許可してるかの確認 46 count = Share.where(ok_request: true).count 47 count > 0 ? count.to_s : zero 48 end 49 50 51 has_many :favorites 52 has_many :likes, through: :favorites, source: :like 53 54 def like(house) 55 self.favorites.find_or_create_by(like_id: house.id) 56 end 57 58 def unlike(house) 59 like = self.favorites.find_by(like_id: house.id) 60 like.destroy if like 61 end 62 63 def like?(house) 64 self.likes.include?(house) 65 end 66 67end

●_ok_button.html.erb(ボタン)

Ruby

1<% if current_user.permit_share?(house) %> 2 <%= form_with( url: unpermit_share_path, local: true, method: :delete) do |f| %> 3 <%= hidden_field_tag :user_id, user.id %> 4 <%= hidden_field_tag :house_id, house.id %> 5 <%= f.submit '許可の取り消し', class: 'btn btn-danger btn-block' %> 6 <% end %> 7<% else %> 8 <%= form_with( url: permit_share_path, local: true) do |f| %> 9 <%= hidden_field_tag :user_id, user.id %> 10 <%= hidden_field_tag :house_id, house.id %> 11 <%= f.submit '申請を許可する', class: 'btn btn-primary btn-block' %> 12 <% end %> 13<% end %>

●_request_users.html.erb(ボタンをrenderするビューページ)

Ruby

1<% house.shares.each do |share| %> 2 <p><%= share.user.name %></p> 3 <%= render 'shares/ok_button', user: share.user, house: house %> 4<% end %>

●shares_controller.rb

Ruby

1class SharesController < ApplicationController 2 before_action :require_user_logged_in 3 4 def create 5 house = House.find(params[:house_id]) 6 current_user.request(house) 7 flash[:success] = '同居申請をしました。' 8 redirect_to houses_path 9 end 10 11 def destroy 12 house = House.find(params[:house_id]) 13 current_user.unrequest(house) 14 flash[:success] = '同居申請を取り消しました' 15 redirect_to houses_path 16 end 17 18 def permit_share 19 share = Share.where(user_id: params[:user_id]) 20 .where(house_id: params[:house_id]) 21 if share 22 share.update(ok_request: true) 23 flash[:success] = '申請を許可しました。' 24 end 25 redirect_to house_path(params[:house_id]) 26 end 27 28 def unpermit_share 29 30 share = Share.where(user_id: params[:user_id]) 31 .where(house_id: params[:house_id]) 32 if share 33 share.update(ok_request: false) 34 flash[:success] = '許可を取り消しました。' 35 end 36 redirect_to house_path(params[:house_id]) 37 end 38 39end

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

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

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

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

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

maisumakun

2020/04/30 08:26

「うまく動作しない」とありますが、どのようになるのでしょうか?
tomohiro2525

2020/04/30 10:20

このメソッドを動作させて、ボタンの表示を切り替えたいのですが、ボタンが切り替わりません。
maisumakun

2020/04/30 10:45

えっと、「判定メソッドの動作」と「画面表示」のどちらに問題があるか切り分けは行いましたか?
tomohiro2525

2020/04/30 11:09

はい、画面表示はif-elsaの条件分岐をしないように書き換えたところ、ボタンどちらも表示させデータベースに反映させることができました。 ですので、判定メソッドの動作に問題があると判定しました。判定メソッドは、テーブル全体でok_requestカラムに値があるとtrueを返すメソッドとなっているようです。ですので、ID個別にtrueかfalseを返せるように記述したいのですが、、わかりませんでした。
winterboum

2020/04/30 13:30

何が問題なのかよくわかりません。 まず、3つのrubyのプログラムですが、file名もしくは class名を併記してください。 modelが3つありそうです。それらの関連を定義している部分を載せてください。 で、なにが問題なのかですが「各IDごとで返す方法」とは 1)どのmodelのID毎に、でしょう? 2) 何を返すのでしょう? 「ok_request が1であるレコードがあるかどうか」ですか?
tomohiro2525

2020/05/01 11:31

返信が遅くなりまして申し訳ありません。modelについて追記しました。 作成中のアプリの概要は、次のとおりです。 1募集主が同居の募集する 2他者が募集に応募する 3募集主が応募に対して、許可をする 3の動きを実装するにあたり等質問の内容に陥りました。 言葉足らずで申し訳ありません。 「sharesテーブルのid4のok_request が1であるレコードがあるかどうか」を返す方法のことを意味しておりました。テーブル内のid別に判定する方法がわからず、質問させていただきました。
winterboum

2020/05/01 11:42

「sharesテーブルのid4のok_request が1であるかどうか」 ではなくて? というのは id4ということは一つの share ですから、「あるかどうか」つまり「複数ある中で1のものがあるか」と言うことにはならないので House(id=4) に応募したuserのなかに ok_requestが1のものがあるか否か ということ? それとも User(is=4)が応募したhouseの中に ok_requestが1のものがあるか否か ということ?
tomohiro2525

2020/05/01 11:52

三度すみません。ご指摘のとおり「sharesテーブルのid4のok_request が1であるかどうか?」「User(is=4)が応募したhouseの中に ok_requestが1のものがあるか否か」という動きを実装したいと思っております。
winterboum

2020/05/01 12:16

sharesテーブルのid4 ってどのidのことですか? id | user_id | house_id と idが3つあります。 prefix無しのidは値4なのはひとつだけですが。 「sharesテーブルのid4のok_request が1であるかどうか?」 と 「User(is=4)が応募したhouseの中に ok_requestが1のものがあるか否か」 は意味が違います
tomohiro2525

2020/05/01 12:22

→id | user_id | house_id 一番左のidのことでした。 ですので、「sharesテーブルのid4のok_request が1であるかどうか?」を判定したいということになります。 曖昧な表現ばかりで申し訳ありません。よろしくお願いいたします。
guest

回答1

0

ベストアンサー

課題 sharesテーブルのid4のok_request が1であるかどうか?

でしたら、
Share.find_by(id: 4)&.ok_request == 1
です。

Share.find(4) にしないのは万一4がないときに例外がでるから
Share.find_by(id: 4)&.ok_request と & を入れたのは、万一4が無いときに例外がでるから

投稿2020/05/01 12:29

winterboum

総合スコア23567

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

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

tomohiro2525

2020/05/01 12:33

丁寧にご解答いただきありがとうます。質問の書き方、問題提示の簡潔化も含め今後勉強していきたいと思います。
winterboum

2020/05/01 12:44

読み返してみれば「sharesテーブルのid4のok_request が1であるかどうか?」という意味のことを言っていますね。 私が混乱したのは、このような基本のことでわからなくなっているとは思わなかったので、「絞り込んだ複数のデータの中に一つでも1のものがあるか」というようなもうちょい複雑なことを聞いているのではないのか?とおもってしまったからでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問