「<<」について

「<<」について

この二箇所「=」と「<<」なぜわざわざ使い分けているのか理解したい。

trait :with_author do
transient do
sequence(:author_name) { |n| "test_author_name_#{n}" }
sequence(:tag_slug) { |n| "test_author_slug_#{n}" }
end

after(:build) do |article, evaluator|
article.author = build(:author, name: evaluator.author_name, slug: evaluator.tag_slug)
end
end

 

trait :with_tag do
transient do
sequence(:tag_name) { |n| "test_tag_name_#{n}" }
sequence(:tag_slug) { |n| "test_tag_slug_#{n}" }
end

after(:build) do |article, evaluator|
article.tags << build(:tag, name: evaluator.tag_name, slug: evaluator.tag_slug)
end
end

 

「=」のところを「<<」に変更し、ターミナルで確認してみたところ...

「NoMethodError:undefined method `each' for #Tag:0x00007f989520ccd8」というエラーが表示された。

eachってことは配列?と思い調べてみたが分からず、質問してみたところ、

 

「=」と「<<」の違いをちゃんと理解していなかった

「=」は代入

左辺を全て右辺の値で上書きする。

「<<」は追加

ActiveRecord::Relationに値を追加する。

 

今回のarticle.tagsは配列=正確にいうとActiveRecord::Relation

→article.tagsを左辺で上書きするのではなく、配列に追加するということをしたかったので、「<<」が使用されている。

 

has_many関連付けを宣言したクラスでは「<<」というメソッドが利用できる

collection<<(object,...)という形で、追加できる

class Article < ApplicationRecord
has_many :tags, through: :article_tags

このように定義されているので、

tags<<(object,...)ができる

参照

https://railsguides.jp/association_basics.html#has-many%E3%81%A7%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%82%8B%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89