📔
[Rails]意図的に空のActiveRecord配列を返したい
前書き
- 以下のように、意図的にレコード件数0件を返したい時にちょっとハマったので備忘録
class TestsController
def index
tests = GetTestsService.new(@current_user).call
render json: tests.eager_load(:questions) # user.todosが存在しない時にエラーになる
end
end
class GetTestsService
def initialize(user)
@user = user
end
def call
todo = user.todos.order(:created_at).first
return [] if todo.blank?
Test.where(todo_id: todo.id)
end
end
以下のようなエラーになる
# tests.eager_load(:questions)
NoMethodError: undefined method `eager_load' for []:Array
原因
-
return []
で返ってくるのはArray
クラス -
Array
クラスには#eager_load
が無い(当たり前)
[1] pry(main)> tests.class
=> Array
結論
- 意図的に件数0を返したい場合は、
ActiveRecord::Relation#none
を使用する - https://railsdoc.com/page/model_none
[1] pry(main)> Test.none.class
=> Test::ActiveRecord_Relation
後書き
Railsって便利
Discussion