[解決済み] Railsで "has_many :through "リレーションはいつ使うのか?
2022-06-05 11:58:03
質問
私は
has_many :through
が何であるか、そしていつそれを使うべきか(そしてどのように)理解しようとしています。しかし、私はそれを得ることはできません。Beginning Rails 3を読んでいますし、ググってみましたが、理解することができません。
どうすれば解決するのでしょうか?
2つのモデルがあるとします。
User
と
Group
.
もし、ユーザーをグループに所属させたいのであれば、次のような方法があります。
class Group < ActiveRecord::Base
has_many :users
end
class User < ActiveRecord::Base
belongs_to :group
end
関連付けに関する追加のメタデータを追跡したい場合はどうすればよいでしょうか。 たとえば、ユーザーがいつグループに参加したか、あるいはグループ内でのユーザーの役割は何か、などです。
そこで、アソシエーションをファーストクラスのオブジェクトにするのです。
class GroupMembership < ActiveRecord::Base
belongs_to :user
belongs_to :group
# has attributes for date_joined and role
end
これは新しいテーブルを導入するものであり、そのために
group_id
カラムをユーザーのテーブルから削除します。
このコードの問題点は、ユーザークラスを使っているすべての場所を更新して変更しなければならないことです。
user.groups.first.name
# becomes
user.group_memberships.first.group.name
この種のコードは最悪で、このような変更を導入するのは苦痛です。
has_many :through
を使えば、両方の長所を生かすことができます。
class User < ActiveRecord::Base
has_many :group_memberships
has_many :groups, :through => :group_memberships # Edit :needs to be plural same as the has_many relationship
end
これで、通常の
has_many
のように扱えますが、必要なときにアソシエーションモデルの恩恵を受けることができます。
なお、これは
has_one
.
編集:ユーザーをグループに追加するのを簡単にする
def add_group(group, role = "member")
self.group_associations.build(:group => group, :role => role)
end
関連
-
[解決済み] 該当するルートがない [GET] "demo/hello"
-
[解決済み] Ruby: public static メソッドを作るには?
-
[解決済み] 属性を割り当てる場合、引数としてハッシュを渡す必要がある
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] エラーが発生しました。pgsqlをrailsで動作させようとすると、Peer authentication failed for user "postgres" と表示されます。
-
[解決済み] Rails 4で懸念事項を使用する方法
-
[解決済み] Rails DBの移行 - テーブルを削除するには?
-
[解決済み] Ruby on Railsで、DateTime、Timestamp、Time、Dateの違いは何ですか?
-
[解決済み] NOT NILを使ったRailsのWHEREコンディション
-
[解決済み] RubyのハッシュオブジェクトをJSONに変換する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] nil:NilClass の未定義メソッド `each'... なぜでしょうか?
-
[解決済み] Ruby/Rails の「フック」とは何ですか?
-
[解決済み] Ruby on Railsのランナー
-
[解決済み] Rubyで変数をインクリメントする [重複]。
-
[解決済み] 該当するルートがない [GET] "demo/hello"
-
[解決済み] Oauth2 Instagram API "リダイレクトURIが登録されたリダイレクトURIと一致しない"
-
[解決済み] Railsで `before_action` での `only:` はどのように機能するのですか?
-
[解決済み] サーバーはRailsで既に稼働している
-
[解決済み] "render :nothing => true" は空のプレーンテキストファイルを返すのですか?
-
[解決済み] RSpecとCucumberの違いは何ですか?[クローズド]