Capisco che desideri ottenere le sezioni in cui l'ultima revisione di ogni sezione ha un parent_section_id = 1;
Ho una situazione simile, in primo luogo, questo è l'SQL (si prega di pensare le categorie come sezioni per voi, post come revisioni e user_id come parent_seection_id -sorry se non lo spostamento il codice per il vostro bisogno, ma devo andare):
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)
E questa è la query in 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)")
questo funziona, è brutto, penso che il modo migliore è quello di "tagliare" la query, ma se si dispone di troppo molte sezioni che sarebbero un problema durante il looping attraverso di esse; puoi anche inserire questa query in un metodo statico e inoltre, la tua prima idea, avere un revision_id all'interno della tua tabella delle sezioni ti aiuterà a ottimizzare la query, ma lascerà cadere la normalizzazione (a volte è necessario), e dovrai essere aggiornando questo campo quando viene creata una nuova revisione per quella sezione (quindi se si stanno facendo molte revisioni in un enorme database potrebbe essere una cattiva idea se si ha un server lento ...)
UPDATE sono tornato hehe, stavo facendo alcuni test, e controllare questo fuori:
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
ho fatto questa domanda e ha lavorato con i miei tavoli (spero chiamato bene la params, è la stessa query di Rails di prima, ma cambio la query nell'avere per l'ottimizzazione); fai attenzione al gruppo; la include lo rende ottimale in grandi dataset, e mi spiace di non aver trovato un modo per creare una relazione con has_one, ma vorrei farlo, ma anche riconsiderare il campo che hai menzionato all'inizio.
Impressionante, grazie! –