#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!
вместо этого, который будет делать именно это.