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

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

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

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

MySQL

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

Ruby on Rails

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

Q&A

解決済

2回答

804閲覧

【Ruby】has_manyの設定について

tomohiro2525

総合スコア12

Ruby on Rails 5

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

MySQL

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

Ruby on Rails

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

0グッド

1クリップ

投稿2020/04/22 23:35

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

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

といった流れの中で3の許可する部分で【許可】、【許可を取下げ】ボタンの切り替えがしたいのですが、user.rbのhas_manyをどう記述したら良いかわかりません。どなたかご教示いただければと思います。

●ユーザーモデル

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 has_many :requestings, through: :shares, source: :house #申請している募集の取得 11 has_many :reverses_of_share, class_name: 'Share', foreign_key: 'ok_request' #自分の募集にリクエストしてくれているユーザーへの参照 12  13 ↓↓↓ここがわかりません↓↓↓ 14 has_many :ok_requestings, through: :●●●, source: :●●● #申請に対して、許可している募集の取得 15 16 def request(house) #申請する動き 17 self.shares.find_or_create_by(house_id: house.id) 18 end 19 20 def unrequest(house) #申請を取り消す動き 21 request = self.shares.find_by(house_id: house.id) 22 request.destroy if request 23 end 24 25 def requesting?(house) #申請してるかの確認 26 self.reverses_of_share.include?(house) 27 end 28 29 def ok_request?(house) #申請してるかの確認 30 self.ok_requestings.include?(house) 31 end 32 33end

●各テーブル

mysql

1mysql> show tables; 2+-----------------------------------+ 3| Tables_in_share-house_development | 4+-----------------------------------+ 5| ar_internal_metadata | 6| favorites | 7| houses | 8| schema_migrations | 9| shares | 10| users | 11+-----------------------------------+ 126 rows in set (0.00 sec)

●申請・許可テーブルの中身

mysql

1mysql> select * from shares; 2+----+---------+----------+------------+---------------------+---------------------+ 3| id | user_id | house_id | ok_request | created_at | updated_at | 4+----+---------+----------+------------+---------------------+---------------------+ 5| 4 | 2 | 2 | 1 | 2020-04-08 13:44:19 | 2020-04-12 10:57:22 | 6| 7 | 1 | 4 | 1 | 2020-04-09 12:50:42 | 2020-04-22 06:45:23 | 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+----+---------+----------+------------+---------------------+---------------------+ 126 rows in set (0.00 sec)

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

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

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

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

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

guest

回答2

0

ベストアンサー

先に出た回答にもありますがUser, House, Shareの関係がこんがらがっているような気がします

Userはシェアハウスの同居人の募集(house)をする
・基本は1ユーザー1募集(ユーザーが複数のシェアハウスを運営する立場を想定しているのであればhas_manyでも問題ないです)
・また、houseだと募集とは意味が異なってくるので募集を意味するRecruitment, ShareHouseRecruitmentなどに名前を変えたほうが良さそうです

Userは募集に対して申請をする
・申請はどのユーザーがどの募集にしたかで特定できます。requestで検索条件がhouseのみなのでこのままでは1つの募集に対して1人しか申請できない状態になってしまいます。検索条件はhouseとuser療法にかけたほうがいいです
・requestの引数でhouseを渡す必要はありません。houseのidを渡したほうが後々楽になると思います
・shareも申請ではないのでapplumentなどにしたほうがわかりやすいと思います

ユーザーの申請のうち許可を得た申請を取得
・ok_requestはテーブルではないのでhas_manyを使う必要はないです。

def permitted_appliments return self.shares.where(ok_request: 1) end

などで取れるかと思います
※ok_requestが1のもののみを取得するhas_manyもあるにはありますが、やり方を忘れてしまいました...おそらく必要ないのでこの方法で頑張ってみてください

投稿2020/04/23 14:43

muranokami

総合スコア33

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

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

tomohiro2525

2020/04/25 05:55

丁寧なご解答ありがとうございます!勉強になりました! permitted_applimentsメソッドは正しく動作するのですが、カラムに一件でも1があるとボタンが反応してしまいます。idごとにwhereする方法などもあるのでしょうか?
guest

0

↓↓↓ここがわかりません↓↓↓ 以前に
has_many :houses #募集テーブル has_many :shares #申請・許可テーブル(フラグカラム有り)
ここが???です。
これですと
0. userは複数の家を持っている
0. 同居人はそのどの家もshareしている

様に見えます。
user は家を一つもち、そこをshareする
のでしょうから、
class User has_one :house clss house has_many :shares
なのでは?
has_many :shares が userでも良いかも、、、ですが。
ユーザと同居するのか、家をshareするのか、 の感覚の違いかな

投稿2020/04/23 09:05

winterboum

総合スコア23401

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問