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(..)
, який слід виконувати однаково. Це робиться десь пізніше, то що є тригером? ;-)