概要
letメソッドで定義したuser_...
の変数だけ使いたい場合、関連オブジェクトのfavorite_...
の定義がちょっと無駄だったりする。
let(:user_1) { create(:user, name: "ハム太郎") }
let(:favorite_1) { create(:favorite, user: user_1, name: "ヒマワリのタネ") }
let(:user_2) { create(:user, name: "まいどくん") }
let(:favorite_2) { create(:favorite, user: user_2, name: "おそうじ") }
let(:favorite_3) { create(:favorite, user: user_2, name: "お金もうけ") }
let(:user_3) { create(:user, name: "トラハムくん") }
let(:favorite_4) { create(:favorite, user: user_3, name: "スケボー") }
let(:favorite_5) { create(:favorite, user: user_3, name: "歌") }
let(:favorite_6) { create(:favorite, user: user_3, name: "ダンス") }
対応
基本
createメソッドでブロック構文を囲み関連オブジェクトのcreateを羅列することでスッキリ書く事ができる。
let(:user_1) {
create(:user, name: "ハム太郎") do |user|
create(:favorite, user:, name: "ヒマワリのタネ")
end
}
let(:user_2) {
create(:user, name: "まいどくん") do |user|
create(:favorite, user:, name: "おそうじ")
create(:favorite, user:, name: "お金もうけ")
end
}
let(:user_3) {
create(:user, name: "トラハムくん") do |user|
create(:favorite, user:, name: "スケボー")
create(:favorite, user:, name: "歌")
create(:favorite, user:, name: "ダンス")
end
}
応用
create_listメソッドでブロック構文を囲むと関連オブジェクト毎に何かできるようになる。
let(:user_4) {
create(:user, name: "ヨクバリス") do |user|
create_list(:favorite, 108, user:) do |favorite|
# TODO: favoriteの数だけ何かできるかも?
end
end
}