0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【豆知識】has_manyの設定について少し理解

Last updated at Posted at 2024-08-31

はじめに

アプリ作成課題のなかで都道府県に関するモデルファイル作成中、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 の追加:
    • PrefectureUser モデルと関連している場合、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を利用するなど、様々な手段でコードを誰にでもわかるように作成していきたいです。
今回の記事が何か参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?