Насколько я понимаю, вы хотите получить разделы, в которых последняя ревизия каждого раздела имеет parent_section_id = 1;
У меня такая же ситуация: во-первых, это SQL (пожалуйста, подумайте о категориях как разделы для вас, сообщения в виде ревизий и user_id как parent_section_id -sorry, если я не переведу код в вашу пользу, но я должен перейти):
SELECT categories.*, MAX(posts.id) as M
FROM `categories`
INNER JOIN `posts`
ON `posts`.`category_id` = `categories`.`id`
WHERE `posts`.`user_id` = 1
GROUP BY posts.user_id
having M = (select id from posts where category_id=categories.id order by id desc limit 1)
И это запрос в Rails:
Category.select("categories.*, MAX(posts.id) as M").joins(:posts).where(:posts => {:user_id => 1}).group("posts.user_id").having("M = (select id from posts where category_id=categories.id order by id desc limit 1)")
Это работает, это некрасиво, я думаю, что лучший способ, чтобы «вырезать» запрос, но если у вас слишком много секций, которые были бы проблемой при прохождении через них; вы также можете разместить этот запрос в статическом методе, а также, ваша первая идея, иметь ревизию_id внутри вашей таблицы разделов, поможет оптимизировать запрос, но откажется от нормализации (иногда это необходимо), и вам придется обновляя это поле, когда новая редакция создается для этого раздела (так что если вы собираетесь делать много изменений в огромной базе данных, возможно, это будет плохая идея, если у вас медленный сервер ...)
UPDATE Я вернулся хех, я делал несколько тестов, и проверить это:
def last_revision
revisions.last
end
def self.last_sections_for(parent_section_id)
ids = Section.includes(:revisions).collect{ |c| c.last_revision.id rescue nil }.delete_if {|x| x == nil}
Section.select("sections.*, MAX(revisions.id) as M")
.joins(:revisions)
.where(:revisions => {:parent_section_id => parent_section_id})
.group("revisions.parent_section_id")
.having("M IN (?)", ids)
end
Я сделал этот запрос и работал с моими таблицами (надеюсь, что я назвал хорошо params, это тот же запрос Rails, но я изменяю запрос в наличии для оптимизации); следить за группой; включение делает его оптимальным в больших наборах данных, и жаль, что я не мог найти способ установить связь с has_one, но я бы пошел с этим, но также пересмотреть поле, которое вы упомянули в начале.
Awesome, Спасибо! –