Rails: ActiveRecord - Пользовательский SQL - PullRequest
4 голосов
/ 18 апреля 2011

Как лучше всего использовать ActiveRecord для выполнения следующего SQL:

SELECT parent.*
FROM sections AS node, sections AS parent
WHERE node.left BETWEEN parent.left AND parent.right
ORDER BY parent.left DESC
LIMIT 1

Я знаю, что можно использовать .limit (), .where () и .order (), но как вы справляетесь с 'from'? Или лучше просто выполнить весь лот как одно утверждение?

Спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 18 апреля 2011

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

ActiveRecord::Base.connection предоставляет метод для выполнения произвольных запросов и получения результатов в различных форматах. select_all или select_rows может быть тем, что вы ищете.

Генератор запросов AREL не всегда такой умный, как хотелось бы, поэтому, если есть сомнения, используйте простейшую форму выражения. В вашем случае это, кажется, тот кусок SQL.

Чтобы переписать его с помощью AREL, вам нужно использовать метод join, чтобы связать его обратно с самим собой.

1 голос
/ 09 мая 2012
Parent.from('sections AS node, sections AS parent')
.where('node.left BETWEEN parent.left AND parent.right')
.order('parent.left DESC')
.limit(1)

И вы получаете преимущество от цепочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...