📔

[Rails]意図的に空のActiveRecord配列を返したい

2023/09/03に公開

前書き

  • 以下のように、意図的にレコード件数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

結論

[1] pry(main)> Test.none.class
=> Test::ActiveRecord_Relation

後書き

Railsって便利

Discussion