Эквивалентный запрос на замену, где найти_by

#ruby-on-rails #activerecord

#ruby-on-rails #activerecord

Вопрос:

 Home.where(code: "x123").where.not(state_id: 1)
  

Как я могу использовать эквивалентный запрос, но вместо использования «where» я хочу использовать find_by.

Ответ №1:

find_by возвращает единственную запись (сначала соответствующую указанным условиям), поэтому нет способа (и смысла) делать то, что вы хотите.

Редактировать

конечно! Но я хочу только один объект!

Тогда это сделает следующий запрос (он будет искать код 123 и любой state_id , кроме 1 . И он возвращает первую запись, соответствующую этому условию):

 Home.find_by(code: '123', state_id: State.ids - [1])
  

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

1. конечно! Но я хочу только один объект!

2. Но я не знаю, как использовать «not» в find_by

3. @dijiri обязательно проверьте последнюю правку ответа, в ней будет выполнен поиск кода 123 и любого state_id , кроме 1 . И он возвращает первую запись, соответствующую этому условию.

4. это вызовет дополнительный вызов базы данных для State.ids и также не очень идиоматично для rails. where(...).first это стандартный способ загрузки отдельного объекта с использованием условий where.

5. @omnikron Я понимаю это, но OP четко заявил I want to use find_by 🙂

Ответ №2:

Если целью является возврат одного объекта, вы можете просто использовать first :

Home.where(code: "x123").where.not(state_id: 1).first

Если причина, по которой вы хотите использовать find_by , заключается в том, что вы хотите, чтобы отсутствующие записи были подняты ActiveRecord::RecordNotFound , тогда вы можете использовать first! вместо этого, который будет делать именно это.