whereМетод повертає ActiveRecord::Relationоб'єкт, а сам по собі цей об'єкт не видає запит до бази даних. Тут важливо , де ви використовуєте цей об’єкт.
У консолі ви, мабуть, робите це:
@person = Person.where(name: "Jason")
А потім blammo видає запит до бази даних і повертає те, що здається масивом усіх на ім’я Джейсон. Так, активний запис!
Але тоді ви робите щось подібне:
@person = Person.where(name: "Jason").where(age: 26)
І тоді це видає інший запит, але цей - для людей, яких називають Джейсоном, яким 26. Але це лише видача одного запиту, то куди пішов інший запит?
Як припускали інші, це відбувається тому, що whereметод повертає проксі-об'єкт. Він насправді не виконує запит і не повертає набір даних, якщо цього не попросили.
Коли ви запускаєте що- небудь у консолі, він видасть перевірену версію результату незалежно від того, що ви запускали. Якщо ви 1введете в консоль і натиснете Enter, ви 1повернетесь, тому що 1.inspectє 1. Магія! Те саме стосується "1". Безліч інших об'єктів не має inspectметод , певні і тому Рубі повертається до одного на Objectякий повертає що - то жахливе , як <Object#23adbf42560>.
У кожному окремому ActiveRecord::Relationоб'єкті inspectвизначено метод, що викликає запит. Коли ви пишете запит у своїй консолі, IRB викличе inspectзначення, що повертається з цього запиту, і виведе щось майже зрозуміле для людини, таке як масив, який ви побачите.
Якби ви просто видавали це у стандартному скрипті Ruby, тоді жоден запит не виконувався б, поки об’єкт не перевірили (через inspect) або не повторили за допомогою each, або не to_aвикликали до нього метод.
До один з цих трьох речей не відбудеться, ви можете ланцюга , як багато whereзаяви про нього , як вам сподобається , і тоді , коли ви робите виклик inspect, to_aабо eachна нього, то він буде , нарешті , виконати цей запит.
x = Person.where(..); @person = x.where(..), який слід виконувати однаково. Це робиться десь пізніше, то що є тригером? ;-)