<<演算子の使い方

<<演算子の使い方
has_manyでアソシエーションを定義していることにより、<<演算子を利用できる。

使い方の例は、以下の通り。(今回は、modelsにメソッドを定義しているので、そのパターンで説明しています。)

[app/models/bookmark.rb]

belongs_to :board
belongs_to :user
validates :user_id, uniqueness: { scope: :board_id }
[app/models/users.rb ファイル(このメソッドは、モデル以外に定義しても大丈夫)]

has_many :bookmarks, dependent: :destroy
has_many :bookmark_boards, through: :bookmarks, source: :board

def bookmark(board)
     bookmark_boards << board
end
[app/controllers/bookmarks_controller.rb]

board = Board.find(params[:board_id])
current_user.bookmark(board)

①[models/user.rb]に定義したbookmarkメソッドは、Userクラスのインスタンスメソッドになっているので、Userクラスのインスタンスに対して引数を渡すことで利用できる。

②引数で使用するboardをboard = Board.find(params[:board_id])で取得。

③current_userという今のユーザーを返すメソッドを使って今のユーザーをレシーバーに利用し、②で取得したboardを引数に渡すことによりcurrent_user.bookmark(board)と記載して、bookmarkメソッドを利用。

④引数で渡しているboardが[bookmark_boards << board]により、bookmark_boards(bookmark(中間テーブル)を通したboardsテーブルの事。bookmarkされているboardだけのレコードの集まり。)に格納される。

⑤アソシエーションに through: :bookmarksと定義(bookmarksテーブルを通してbookmark_boardsを持っている。)していることにより、bookmark_boardsに格納されたらbookmarksテーブルにも格納される。追加されるオブジェクトの外部キー(boardの外部キー[user_id])は、メソッドを呼び出したインスタンスの主キー(current_user)に設定される。

bookmark_boards << boardにより、bookmarksテーブルにもboardが格納される動きは、以下のテストからも分かる。 Image from Gyazo Image from Gyazo Image from Gyazo