Запрос Activerecord в поисках нулевого перечисления

#ruby-on-rails #activerecord #enums

#ruby-on-rails #activerecord #перечисления

Вопрос:

Я выполняю запрос ActiveRecord с объединением. У меня есть опросы, состоящие из вопросов (где я сохраняю ответ). Я хотел бы ограничить / выбрать записи, в которых указано значение (статус) enum’d по вопросу. равно «nil», поскольку оно не было задано пользователем.

Я могу получить соединение, возвращающее то, что я хочу, за исключением ограничения значением перечисления «nil» или «».

Вот модель опроса:

 class Survey < ApplicationRecord

  enum question_one_response: { very_dissapointed: 0, somewhat_dissapointed: 1, not_dissapointed: 2 }

  belongs_to :product
  has_one :survey_request
  has_many :questions

  accepts_nested_attributes_for :questions
  validates :questions, :presence => true

end
  

Вот модель вопроса:

 class Question < ApplicationRecord

  enum status: { useful: 0, not_useful: 1, archived: 2 }
  belongs_to :survey

end
  

статус — целое число

Вот код, который «работает», но не включает требование «nil»:

 @response = Question.joins(:survey).where('surveys.product_id = ? and surveys.question_one_response = ? and questions.question_number = ?', @product.id, 1, 4)
  

Вот несколько вариантов, которые я пробовал без какого-либо успеха:

 @response = Question.joins(:survey).where('surveys.product_id = ? and surveys.question_one_response = ? and questions.question_number = ? and questions.status = ?', @product.id, 1, 4, nil)

@response = Question.joins(:survey).where('surveys.product_id = ? and surveys.question_one_response = ? and questions.question_number = ? and questions.status = ?', @product.id, 1, 4, "")

@response = Question.joins(:survey).where('surveys.product_id = ? and surveys.question_one_response = ? and questions.question_number = ? and questions.status = ?', @product.id, 1, 4, blank?)
  

Комментарии:

1. с какой ошибкой вы столкнулись? первый запрос должен работать @response = Question.joins(:survey).where('surveys.product_id = ? and surveys.question_one_response = ? and questions.question_number = ? and questions.status = ?', @product.id, 1, 4, nil)

Ответ №1:

Вы должны использовать либо

 Question
  .joins(:survey)
  .where(surveys: { product_id: @product.id })
  .where(surveys: { question_one_response: 1 })
  .where(question_number: 4)
  .where(status: nil)
  

или….

 Question
  .joins(:survey)
  .where(surveys: { product_id: @product.id })
  .where(surveys: { question_one_response: 1 })
  .where(question_number: 4)
  .where('status IS NULL')