はじめに
アプリ作成課題のなかで都道府県に関するモデルファイル作成中、has_many
について少しわからなくなってしまったので、調べて学んだことをアウトプットしたいと思います。
環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3
疑問に思ったこと
1:has_many :users
が必要かどうか
class Prefecture < ApplicationRecord
has_many :posts
end
都道府県に関するモデルファイルが上記のようになっているがここにhas_many :usersは不要かがわからなくなりました。
ついでにファイルを行ったり来たりしているのもありだんだんとコードの意味があいまいに💦
2:ますはコードの意味から
-
has_many :posts
:-
Prefecture
モデルは、Post
モデルと一対多の関係を持っています。 - つまり、1つの
Prefecture
に対して、多くのPost
が関連付けられることを示しています。 - 例えば、東京都に関連するすべてのポストを取得することができます。
-
3:では次にhas_many :users
の必要性について
-
has_many :users
の追加:-
Prefecture
がUser
モデルと関連している場合、has_many :users
を追加する必要があります。 - 現在のポストモデルの定義には、
Prefecture
からUser
への関連が明示的には含まれていません。 - 一般的に、都道府県(
Prefecture
)はユーザー(User
)に直接関連しないため、has_many :users
は通常不要です。
-
5:has_many :users
を追加すべきか
-
必要な場合:
- もし
Prefecture
モデルがUser
モデルと一対多の関係を持つ場合(例えば、各都道府県に複数のユーザーが属しているなど)、has_many :users
を追加する必要がある
- もし
-
不要な場合:
- 現在のコードに
has_many :users
を追加する必要がない場合が多い。ポストモデルの定義や仕様に基づくと、ユーザーと都道府県が直接関連しているわけではないため、has_many :users
は不要
- 現在のコードに
6:私の見解があっているか確認してみる
路線名で検索をかけた時はユーザーからではなくあくまでポストに記載されいる路線名をサーチして該当する路線名がかかれたポストの一覧を表示するのであって、路線名が複数のユーザーを持っているわけではないという事であっているのか?
A:正しい
7:あらためて路線名での検索の意図
-
ポストに記載される路線名:
- ポストモデルに
line
という属性があり、そこに路線名が記載されます。 - 路線名で検索をかけると、ポストモデル内の
line
属性を対象に検索します。 - つまり、ユーザーに関連する路線名ではなく、ポスト自体に含まれる路線名に基づいて検索が行われます。
- ポストモデルに
8:検索の仕組み
-
検索処理:
- ポストモデルのスコープ
search_by_line
を使用して、ポストのline
属性を部分一致で検索します。 - これにより、指定された路線名が含まれるポストの一覧が表示されます。
- ポストモデルのスコープ
9:ユーザーとの関連性
-
ユーザーと路線名:
-
line
属性はポストに関連しており、ユーザーと直接的な関係はありません。 - ユーザーが複数のポストを作成する可能性があるが、路線名がユーザーに直接関連するわけではありません。
-
10:コードの確認
ポストモデルのスコープ search_by_line
を確認してみる
scope :search_by_line, ->(line_name) { where('line.name LIKE ?', "%#{line_name}%") if line_name.present? }
このスコープは、ポストの line.name
属性を検索対象としており、ユーザーとは関係ないことがわかる
まとめ
-
検索対象: ポストモデルの
line
属性(ポストに記載されている路線名) - 検索結果: 指定された路線名が含まれるポストの一覧
- ユーザーとの関係: ユーザーは路線名検索に直接関与しない
さいごに
不要なコードはなるべくなくしたいし、エラーが発生しないようにもしたい。自分の見解が正しいかいろんなサイトをみたりGPTを利用するなど、様々な手段でコードを誰にでもわかるように作成していきたいです。
今回の記事が何か参考になれば幸いです。