現在、シェアハウスのマッチングアプリを作成中です。
イメージとして次のような動きをします。
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
回答1件
あなたの回答
tips
プレビュー