技術メモ

書いておぼえるブログ

【Active Record】findとwhereで返り値が異なる

状況

whereで取得したレコードセットにメソッドをはやしたらエラーになる。

解決

配列の添字を指定してメソッドを実行する。

コード

Book.where("author LIKE '%#{name}%'").update(author: new_name)

考察

findでIDを指定した場合に返ってくるのはただの変数。whereで条件指定すると配列で返ってくる。 だから、

Book.where(author_id: id).update(price: price)

は失敗する。

ではなくて、こうしなければならない。

Book.where(author_id: id)[0].update(price: price)

ただし、

Book.where(author_id: id).each do |book|
  book.update(price: price)
end

はとおる。

whereの返り値が配列だということを忘れてはならない。