gpt4 book ai didi

ruby-on-rails - Rails协会has_one最新记录

转载 作者:行者123 更新时间:2023-12-03 15:10:08 25 4
gpt4 key购买 nike

我有以下模型:

class Section < ActiveRecord::Base
belongs_to :page
has_many :revisions, :class_name => 'SectionRevision', :foreign_key => 'section_id'
has_many :references

has_many :revisions, :class_name => 'SectionRevision',
:foreign_key => 'section_id'

delegate :position, to: :current_revision

def current_revision
self.revisions.order('created_at DESC').first
end
end

其中 current_revision是最近创建的 revision。是否可以将 current_revision转换为关联,以便我可以执行类似 Section.where("current_revision.parent_section_id = '1'")的查询?还是应该在数据库中添加一个 current_revision列,而不是尝试通过虚拟方式或通过关联来创建它?

最佳答案

我了解您想获取每个部分的最新修订版的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建立关系的方法,但是我会继续这样做,但还要重新考虑您一开始提到的字段。

关于ruby-on-rails - Rails协会has_one最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15824041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com