У меня есть две модели ActiveRecord: Post
и Vote
. Я хочу сделать простой запрос:Подзапрос Rails уменьшает количество необработанного SQL
SELECT *,
(SELECT COUNT(*)
FROM votes
WHERE votes.id = posts.id) AS vote_count
FROM posts
Мне интересно, что это лучший способ сделать это в ActiveRecord DSL. Моя цель - свести к минимуму количество SQL, которое я должен написать.
я могу сделать Post.select("COUNT(*) from votes where votes.id = posts.id as vote_count")
Две проблемы с этим:
- Сырье SQL. В любом случае, чтобы написать это в DSL?
- Это возвращает только атрибут
vote_count
, а не «*» + vote_count. Я могу добавить.select("*")
, но я буду повторять это каждый раз. Есть ли гораздо лучший/суровый способ сделать это?
Благодаря
Вам действительно нужен этот подзапрос? Он выполняется один раз для каждой строки и вызывает огромную производительность. Разве вы не предпочитаете JOIN? 'SELECT posts. *, COUNT (votes.id) FROM posts LEFT JOIN голосов ON posts.id = votes.id GROUP BY posts.id, posts.title' – skalee
@skalee Если вы не используете старую версию SQL db из 90-х годов, он достаточно умен, чтобы распознавать и оптимизировать запрос. В моих тестах, делая это через JOIN или подзапрос, вы принимаете равное количество времени, за исключением того, что подзапрос является более понятным/читаемым (но это только мое мнение). Несмотря на это, я считаю, что при использовании подзапроса нет проблем с производительностью. – 0xSina
IMO в этом конкретном случае соединение более читаемо, однако я понимаю, что ваш вопрос более общий и применим и к другим запросам. – skalee