我了解您想要获取每个部分的最后修订版本具有 parent_section_id = 1 的部分;
我有类似的情况,首先,这是 SQL(请认为类别为您的部分,帖子为修订版,user_id 为 parent_section_id -对不起,如果我没有根据您的需要移动代码,但我必须去):
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)")
这行得通,很难看,我认为最好的方法是“剪切”查询,但是如果您有太多的部分,那么在遍历它们时会出现问题;您也可以将此查询放入静态方法中,而且,您的第一个想法是,在您的sections 表中有一个 revision_id 将有助于优化查询,但会放弃规范化(有时需要),您必须在为该部分创建新修订时更新此字段(因此,如果您要在庞大的数据库中进行大量修订,那么如果您的服务器速度较慢,这可能是个坏主意......)
更新
我回来了,呵呵,我正在做一些测试,看看这个:
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
我做了这个查询并使用我的表(希望我很好地命名了参数,它与之前的 Rails 查询相同,但我在优化时更改了查询);留意小组;包含使其在大型数据集中成为最佳选择,抱歉我找不到与 has_one 建立关系的方法,但我会同意这一点,但也要重新考虑你在开头提到的领域。