LINUX.ORG.RU

Как работают методы запросов в ruby on rails?

 , , ,


0

2

Хочу у себя так же реализовать, но как они это сделали - колдовство какое-то. Что имею в виду: Model.where(...).select(...).order(...).limit(...).offset(...) Все эти методы знают, когда нужно послать запрос в базу, а когда не нужно, потому что дальше этот запрос дополняться будет. Вот чисто логически - как оно работает? Метапрограммирование какое-нибудь, только на няшке Руби доступное?


Не знаю ruby. В django запрос выполняется когда ты начинаешь итерироваться по этому объекту. Думаю в ROR сделано аналогично.

pawnhearts ★★★★★
()

Причем цепочку разорвать можно, а ему хоть бы хны.

q = Model.where(...)
2 + 2
q = q.select(...)
Все равно один запрос только.

Romaboy
() автор топика
Ответ на: комментарий от Romaboy

Напечатать что? Данные? Для этого надо итерироваться, чтобы их получить.

Почему ты в исходники не глянишь, кстати?

pawnhearts ★★★★★
()
Ответ на: комментарий от Romaboy

По первому вопросу, в конце этой цепочки в любом случае вызывается какой нибудь each, to_a, to_json... которые и инициируют отправку запроса.

По второму, это один и тот же объект, where, select это мутаторы.

TDrive ★★★★★
()

Пока ты не начинаешь читать результаты, запрос существует только во внутренностях AR, и выполняется только тогда, когда начинаешь обращаться к атрибутам или прочие операции делать, для которых результаты нужны.

https://ru.wikipedia.org/wiki/Отложенная_инициализация

INFOMAN ★★★★★
()

Исходники мало чем помогут, только запутают. Пишу на lua (ну на lua пишу и че, только с сахаром вроде coffeescript). Вот где-то примерно по реализации он походит на js, то есть python, ruby - это ООП, а lua и js это прототипные. Возможно ли такую отложенную инициализацию на js написать?

Romaboy
() автор топика
Ответ на: комментарий от TDrive

puts вызывает, но врядли она результаты нормально выведет. А p показывает массивы с объектами как они есть

Romaboy
() автор топика
Ответ на: комментарий от Romaboy

Кстати спасибо за ответы всем, самый отзывчивый форум

Romaboy
() автор топика

Ленивая загрузка похоже. Возможны реализации сервис-локатор, контейнер зависимостей ...

anonymous
()
Ответ на: комментарий от Romaboy

Возможно ли такую отложенную инициализацию на js написать?

Да, но не факт, что будет такой же красивый синтаксис.

Суть: где-то в Model заводишь приватное свойство, в котором будешь хранить результаты запросов. Когда нужно выдавать результаты запроса — составляешь запрос по цепочке фильтров, смотришь, делал ли ты такой и если нет — делаешь, кладёшь выхлоп в Model, отдаёшь. Всё.

x3al ★★★★★
()
Ответ на: комментарий от x3al

И да, тебе понадобится что-то вроде super() или велосипедить интроспекцию как-нибудь ещё, чтобы составлять эту самую цепочку на каждом шаге.

Как альтернатива — ищешь ORM в npm, смотришь исходники, делаешь так же.

x3al ★★★★★
()
Последнее исправление: x3al (всего исправлений: 1)

опустим трэш и угар с свойствами класса/инстанса...

пусть будет:

  Класс Модель:
    Метод фильтруй_епт(чо_ты_гонишь):
      чо.фильтруй_базар.говорю(чо_ты_гонишь)
      на чо
    Метод дай_посмотреть(вот_эта):
      чо.вот_эта = вот_эта
      на чо
    Метод дай_погонять():
      фильтруй_епт = вере_клаус_блеать(чо.фильтруй_базар)
      дай_епт = селект_клаус_блеать(чо.вот_эта)
      типа_курсор = адаптера_бд_типа(дай_епт, фильтруй_епт)
      типа_курсор дай погонять это:
        поцаны держите я это отжал

exception13 ★★★★★
()

Ладно, по Вашим ссылкам нихрена не понятно, особенно пример фильтруй_курсор_блеать, но у меня вышло! В луе 5.1 есть типа супер быстрый luajit компилятор, который пришлось пересобрать с опцией поддержки луа 5.2, и теперь можно вешать свою функцию на получение длинны массива для итерации (__len называется). Вот для js я сомневаюсь, что можно такое делать, но его для примера привёл. Теперь понимаю прелесть ооп

Romaboy
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.