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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

1回答

3183閲覧

railsのhas_manyで存在しないテーブルを指定する際の疑問

mitsuru793

総合スコア157

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2015/09/29 01:29

下記のチュートリアルで質問があります。

第11章 ユーザーをフォローする | Rails チュートリアル

Twitterのようなフォロー、フォロワーの関係をusers, relationshipsの2つのテーブルで表すというものです。

ruby

1#schema.rb 2ActiveRecord::Schema.define(version: 20130315230445) do 3 create_table "relationships", force: true do |t| 4 t.integer "follower_id" 5 t.integer "followed_id" 6 t.datetime "created_at" 7 t.datetime "updated_at" 8 end 9 10 add_index "relationships", ["followed_id"], name: "index_relationships_on_followed_id" 11 add_index "relationships", ["follower_id", "followed_id"], name: "index_relationships_on_follower_id_and_followed_id", unique: true 12 add_index "relationships", ["follower_id"], name: "index_relationships_on_follower_id" 13 14 create_table "users", force: true do |t| 15 t.string "name" 16 t.string "email" 17 t.datetime "created_at" 18 t.datetime "updated_at" 19 t.string "password_digest" 20 t.string "remember_token" 21 t.boolean "admin" 22 end 23 24 add_index "users", ["email"], name: "index_users_on_email", unique: true 25 add_index "users", ["remember_token"], name: "index_users_on_remember_token" 26 27end

ruby

1#user.rb 2class User < ActiveRecord::Base 3 has_many :relationships, foreign_key: "follower_id", dependent: :destroy 4 has_many :followed_users, through: :relationships, source: :followed 5 has_many :reverse_relationships, foreign_key: "followed_id", 6 class_name: "Relationship", 7 dependent: :destroy 8 has_many :followers, through: :reverse_relationships, source: :follower

ruby

1#relationship.rb 2class Relationship < ActiveRecord::Base 3 belongs_to :follower, class_name: "User" 4 belongs_to :followed, class_name: "User" 5 validates :follower_id, presence: true 6 validates :followed_id, presence: true 7end

質問1

has_many :followed_users, through: :relationships, source: :followedthroughでrelationshipsテーブルを指定しています。このためにhas_many :relationships, ~が必要なのでしょうか?relationshipsというテーブルは実在するため必要ないのではと思いました。

質問2

has_many :followed_users, through: :relationships, source: :followedはrelationshipモデルに定義したfollowedプロパティをUserモデルでfollowed_usersというプロパティでアクセス可能にするという認識で合っていますでしょうか?

質問3

has_many :reverse_relationships,~では実在しないテーブルを指定しています。これは架空にreverse_relationshipsというテーブルを作りだしています。DBに例えるとViewのようなものだと思っています。has_manybelongs_toはテーブルを指定するというよりは、Viewを定義するということに近いのでしょうか?

ご回答、よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

質問1ですが、Twitterのようなサービスを想定すると、「フォロー/フォロワー関係」自体が操作の対象となる場面があるので、明示的にhas_manyを宣言しています。一般的な多対多関係でも中間テーブルは必要となりますが、単に対応を作るためだけのもので、直接それ自体を操作しないのなら、has_many :throughだけで問題ありません。

質問2はそう解釈して問題ありません。

質問3ですが、Rails上のリレーションはあくまで「クラスとクラスの関係」です。ただ、フォロワーもフォローされている人も同じRelationshipである以上、別に名前をつけないと処理できないので、この関係reverse_relationという名前を付けています。同じクラス同士の関係が1つなら、Rails側で「関係性の名前=クラス名」として処理を進めてくれます(設定より規約)。

投稿2015/09/29 01:39

maisumakun

総合スコア145183

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

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

mitsuru793

2015/09/29 21:32

ご回答頂き、ありがとうございます。 > 「フォロー/フォロワー関係」自体が操作の対象となる場面 一括フォローとかかなと思いましたが、これはuser. followed_users.createで対応できるかなと思いました。何か他にあるのでしょうか? > Rails上のリレーションはあくまで「クラスとクラスの関係」です。 この言葉がしっくり来ました。あくまでクラス上の話で、DBの関係は無視しているのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問