質問編集履歴

2 追記

PartyKids

PartyKids score 57

2017/05/04 04:52  投稿

アソシエーションの考え方/has_many & belongs_to
GW中ありがとうございます。
rails tutorialや本を何度読み返したり、図にしたりしても日本語が分からず、理解できないので助けてください。
###疑問
外部キーの意味が良くわからないため、詰まっています。
has_many や belongs_to は、テーブル間の関係性を表すもので、実際にテーブル間を繋げるのは外部キーによってである。っという考え方をしていました。が、その考え方だと、詰まってしまうので、助けてください。
```ruby
###user.rb
has_many :microposts, dependent: :destroy
has_many :active_relationships, class_name: "Relationship",
          foreign_key: "follower_id",
          dependent: :destroy
###microposts.rb
belongs_to :user
###relationships.rb
belongs_to :follower, class_name: "User"
belongs_to :followed, class_name: "User"
```
```ruby
###schema.rb
create_table "users", force: :cascade do |t|
   t.string "name"
   t.string "email"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.string "password_digest"
   t.string "remember_digest"
   t.boolean "admin", default: false
   t.string "activation_digest"
   t.boolean "activated", default: false
   t.datetime "activated_at"
   t.string "reset_digest"
   t.datetime "reset_sent_at"
   t.index ["email"], name: "index_users_on_email", unique: true, using: :btree
 end
create_table "microposts", force: :cascade do |t|
   t.text    "content"
   t.integer "user_id"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.string  "picture"
   t.index ["user_id", "created_at"], name: "index_microposts_on_user_id_and_created_at", using: :btree
   t.index ["user_id"], name: "index_microposts_on_user_id", using: :btree
 end
create_table "relationships", force: :cascade do |t|
   t.integer "follower_id"
   t.integer "followed_id"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.index ["followed_id"], name: "index_relationships_on_followed_id", using: :btree
   t.index ["follower_id", "followed_id"], name: "index_relationships_on_follower_id_and_followed_id", unique: true, using: :btree
   t.index ["follower_id"], name: "index_relationships_on_follower_id", using: :btree
 end
```
###私の考え
user と micropostの関係性
userは複数の呟き(micropost)をする事が出来るので、user.rbにhas_manyと書く。逆に一つの呟きは必ず一人のユーザーによってなされるため、belongs_toを書く。
user と micropostの外部キー
> Railsはデフォルトでは外部キーの名前を<class>_idといったパターンとして理解
ここから、よく意味が分からなくなりました。。。
user.rb に has_many :**microposts**っと書けるのは、micropostsテーブルに**user_idカラム**があるから?
逆に、microposts.rb に **belongs_to :user** と書いているが、usersテーブルにmicroposts_idカラムなんてないけど。。。。
質問するにあたって、まとめて整理してみましたが、やっぱり意味が分からず、支離滅裂な質問文になってしまいましたが、よろしくお願いいたします。
###追記
モデルAとモデルBがあり、テーブルAの情報をテーブルBに組み込みたいと仮定する(1対多)。
この時の主キーは、テーブルAのID(一意)であり、モデルBにあるa_idが外部キーとなる。
```ruby
###a.rb
has_many :b
###b.rb
belongs_to :a
```
a,bは、モデル自身が見るべきモデルクラスを示唆しているだけで、外部キーや主キーの情報ではない。
a.rbは、has_many: b の **b** から、model class B を見て、自身のモデルクラス_IDがあることを知り、a→bのモデルが結合する。
逆に、b.rbは、belongs_to :a の **a** から、model class a を見て、自身のモデルクラス_IDがないため、aの主キーをベースに、b→aのモデルが結合する。
って事ですか?
```ruby  
 
has_many :active_relationships, class_name: "Relationship",  
                                 foreign_key: "follower_id",  
                                 dependent:  :destroy  
```  
 
上記のコードで、『foreign_key: "follower_id"』っと記載しているのは、これを書かなかったら、active_relationshipsテーブルの主キーを外部IDと認識してしまうため、書いているのですか?  
 
 
 
長文で申し訳ないですが、よろしくお願いいたします。
  • Ruby on Rails

    9064 questions

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

1 追記

PartyKids

PartyKids score 57

2017/05/04 04:46  投稿

アソシエーションの考え方/has_many & belongs_to
GW中ありがとうございます。
rails tutorialや本を何度読み返したり、図にしたりしても日本語が分からず、理解できないので助けてください。
###疑問
外部キーの意味が良くわからないため、詰まっています。
has_many や belongs_to は、テーブル間の関係性を表すもので、実際にテーブル間を繋げるのは外部キーによってである。っという考え方をしていました。が、その考え方だと、詰まってしまうので、助けてください。
```ruby
###user.rb
has_many :microposts, dependent: :destroy
has_many :active_relationships, class_name: "Relationship",
          foreign_key: "follower_id",
          dependent: :destroy
###microposts.rb
belongs_to :user
###relationships.rb
belongs_to :follower, class_name: "User"
belongs_to :followed, class_name: "User"
```
```ruby
###schema.rb
create_table "users", force: :cascade do |t|
   t.string "name"
   t.string "email"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.string "password_digest"
   t.string "remember_digest"
   t.boolean "admin", default: false
   t.string "activation_digest"
   t.boolean "activated", default: false
   t.datetime "activated_at"
   t.string "reset_digest"
   t.datetime "reset_sent_at"
   t.index ["email"], name: "index_users_on_email", unique: true, using: :btree
 end
create_table "microposts", force: :cascade do |t|
   t.text    "content"
   t.integer "user_id"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.string  "picture"
   t.index ["user_id", "created_at"], name: "index_microposts_on_user_id_and_created_at", using: :btree
   t.index ["user_id"], name: "index_microposts_on_user_id", using: :btree
 end
create_table "relationships", force: :cascade do |t|
   t.integer "follower_id"
   t.integer "followed_id"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.index ["followed_id"], name: "index_relationships_on_followed_id", using: :btree
   t.index ["follower_id", "followed_id"], name: "index_relationships_on_follower_id_and_followed_id", unique: true, using: :btree
   t.index ["follower_id"], name: "index_relationships_on_follower_id", using: :btree
 end
```
###私の考え
user と micropostの関係性
userは複数の呟き(micropost)をする事が出来るので、user.rbにhas_manyと書く。逆に一つの呟きは必ず一人のユーザーによってなされるため、belongs_toを書く。
user と micropostの外部キー
> Railsはデフォルトでは外部キーの名前を<class>_idといったパターンとして理解
ここから、よく意味が分からなくなりました。。。
user.rb に has_many :**microposts**っと書けるのは、micropostsテーブルに**user_idカラム**があるから?
逆に、microposts.rb に **belongs_to :user** と書いているが、usersテーブルにmicroposts_idカラムなんてないけど。。。。
質問するにあたって、まとめて整理してみましたが、やっぱり意味が分からず、支離滅裂な質問文になってしまいましたが、よろしくお願いいたします。
質問するにあたって、まとめて整理してみましたが、やっぱり意味が分からず、支離滅裂な質問文になってしまいましたが、よろしくお願いいたします。
###追記
モデルAとモデルBがあり、テーブルAの情報をテーブルBに組み込みたいと仮定する(1対多)。
この時の主キーは、テーブルAのID(一意)であり、モデルBにあるa_idが外部キーとなる。
```ruby
###a.rb
has_many :b
###b.rb
belongs_to :a
```
a,bは、モデル自身が見るべきモデルクラスを示唆しているだけで、外部キーや主キーの情報ではない。
a.rbは、has_many: b の **b** から、model class B を見て、自身のモデルクラス_IDがあることを知り、a→bのモデルが結合する。
逆に、b.rbは、belongs_to :a の **a** から、model class a を見て、自身のモデルクラス_IDがないため、aの主キーをベースに、b→aのモデルが結合する。
って事ですか?
長文で申し訳ないですが、よろしくお願いいたします。
  • Ruby on Rails

    9064 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る