railsチュートリアル第１３章 User/Micropostの関連付け

###User/Micropostの関連付け

####マイクロポストがユーザーに所属する関連付け
app/models/micropost.rb

```rb
class Micropost < ApplicationRecord
# ApplicationRecordを継承したモデルが作られます
  belongs_to :user
  # userモデルとの間に「1対1」のつながりが設定
  # 割り当てる
  validates :user_id, presence: true
  # presence これは存在するか
  # presenceメソッドはオブジェクトが存在すればそのオブジェクトを返し、
  #   オブジェクトが存在しなければnilを返すメソッドとなります
  validates :content, presence: true, length: { maximum: 140 }
  # 最大１４０文字まで
end
```
####ユーザーがマイクロポストを複数所有する（has_many）関連付け
app/models/user.rb

````rb
class User < ApplicationRecord
  has_many :microposts
  # 他のモデルとの間に「1対多」のつながり
  # has_many関連付けが使われている場合、
  #   「反対側」のモデルでは多くの場合belongs_toが使われます。
.
.
.
end
```
####慣習的に正しくマイクロポストを作成する 
test/models/micropost_test.rb

```rb
require 'test_helper'

class MicropostTest < ActiveSupport::TestCase

  def setup
    @user = users(:michael)
    # このコードは慣習的に正しくない
    @micropost = @user.microposts.build(content: "Lorem ipsum") 
    # contentが"Lorem ipsum"の新しいMicropostオブジェクトを返す
  end
.
.
.
end
```
#####テスト
```
ubuntu:~/environment/sample_app (user-microposts) $ rails t
Running via Spring preloader in process 7077
Started with run options --seed 64842

  51/51: [============================] 100% Time: 00:00:04, Time: 00:00:04

Finished in 4.85194s
51 tests, 219 assertions, 0 failures, 0 errors, 0 skips
```

###演習
1.
データベースにいる最初のユーザーを変数userに代入してください。そのuserオブジェクトを使ってmicropost = user.microposts.create(content: "Lorem ipsum")を実行すると、どのような結果が得られるでしょうか?

```rb
>> user = User.first
   (1.8ms)  SELECT sqlite_version(*)
  User Load (1.1ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "Example User", email: "example@railstutorial.org", created_at: "2021-10-17 05:28:48", updated_at: "2021-10-20 14:25:39", password_digest: [FILTERED], remember_digest: nil, admin: true, activation_digest: "$2a$12$x4xVHmtrDFjVPFFWav31UebLY8r9sdT8ImzSXGSrnqt...", activated: true, activated_at: "2021-10-17 05:28:48", reset_digest: "$2a$12$FhfOA3Y7VPJ3TJJ5nNUEkuSH0hkGrrW15uyYE9EwbrC...", reset_sent_at: "2021-10-20 14:25:39">
>> micropost = user.microposts.create(content: "Lorem ipsum")
   (0.1ms)  begin transaction
  Micropost Create (11.7ms)  INSERT INTO "microposts" ("content", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["content", "Lorem ipsum"], ["user_id", 1], ["created_at", "2021-10-22 13:53:49.381447"], ["updated_at", "2021-10-22 13:53:49.381447"]]
   (11.4ms)  commit transaction
=> #<Micropost id: 2, content: "Lorem ipsum", user_id: 1, created_at: "2021-10-22 13:53:49", updated_at: "2021-10-22 13:53:49">
```
それがあったらしい。

2.
先ほどの演習課題で、データベース上に新しいマイクロポストが追加されたはずです。user.microposts.find(micropost.id)を実行して、本当に追加されたのかを確かめてみましょう。また、先ほど実行したmicropost.idの部分をmicropostに変更すると、結果はどうなるでしょうか?

```rb
>> user.microposts.find(micropost.id)
  Micropost Load (0.3ms)  SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? AND "microposts"."id" = ? LIMIT ?  [["user_id", 1], ["id", 2], ["LIMIT", 1]]
=> #<Micropost id: 2, content: "Lorem ipsum", user_id: 1, created_at: "2021-10-22 13:53:49", updated_at: "2021-10-22 13:53:49">
>> user.microposts.find(micropost)
Traceback (most recent call last):
        1: from (irb):6
ArgumentError (You are passing an instance of ActiveRecord::Base to `find`. Please pass the id of the object by calling `.id`.)
```

3.
user == micropost.userを実行した結果はどうなるでしょうか? また、user.microposts.first == micropost を実行した結果はどうなるでしょうか? それぞれ確認してみてください。

```rb
>> user == micropost.user
=> true
>> user.micropost.first == micropost
Traceback (most recent call last):
        1: from (irb):16
NoMethodError (undefined method `micropost' for #<User:0x00007f4c14a20f28>)
Did you mean?  microposts
               microposts=
```