QA@IT

Rails4でdeprecatedになったallのwhere(nil)以外の代替はありますか?

3010 PV

Rails4で.allを使用すると下記の通りdeprecatedのWARNINGが出ますが、

Item.all.to_sql
=> "SELECT \"items\".* FROM \"items\""
DEPRECATION WARNING: Relation#all is deprecated. If you want to eager-load a relation, you can call #load (e.g. `Post.where(published: true).load`). If you want to get an array of records from a relation, you can call #to_a (e.g. `Post.where(published: true).to_a`). (called from index at /Users/shu/labo/threestars/app/controllers/items_controller.rb:7)

.allの代替として.to_a.loadを使おうとすると下記のエラーになります。

Item.to_a.to_sql
NoMethodError: undefined method `to_a' for #<Class:0x007fbde08f8720>
Item.load.to_sql
ArgumentError: wrong number of arguments (0 for 1..2)

scopedの場合は下記のWARNINGになります。

Item.scoped.to_sql
DEPRECATION WARNING: Model.scoped is deprecated. Please use Model.all instead. (called from __pry__ at (pry):9)
=> "SELECT \"items\".* FROM \"items\""

特にwhereorderを指定せずにItem.allと同じ処理を行おうとする場合、下記のようにwhere(nil)を指定するしかないのでしょうか?

Item.where(nil).to_sql
=> "SELECT \"items\".* FROM \"items\""

エラーやWARNINGが出ないwhere(nil)よりスマートな方法はありますでしょうか?
(where(nil)だと特に必要の無いwhereを指定しなければならないところに何となく気持ち悪さがあります。。)

  • `Item.all.to_sql`ではWARNINGは出ないようです。どこかでRelation#allの形で呼んでいたためのようです。クローズします。 -

回答

Item.all.to_sqlではWARNINGは出ないようです。
どこかでRelation#allの形で呼んでいたためのようです。
クローズします。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。