gpt4 book ai didi

ruby-on-rails-3 - Rails 祖先分页

转载 作者:行者123 更新时间:2023-12-01 16:46:56 25 4
gpt4 key购买 nike

我刚刚学习了 Railscast 教程:

http://railscasts.com/episodes/262-trees-with-ancestry

是否可以对已排列的 Ancestry 结果进行分页?例如:假设我的消息 Controller 中有以下内容:

def index
@messages = Message.arrange(:order => :name)
end

那么我将如何对其进行分页,因为它将产生哈希值?

更新我发现如果我使用 .keys 那么它会分页,但只有顶层而不是子级。

Message.scoped.arrange(:order => :name).keys

更新每条消息都有一个代码和一些内容。我可以嵌套消息

假设我有

代码 - 名称

1 - Test1
1 - test1 sub1
2 - test1 sub2
2 - Test2
1 - test2 sub1
2 - test2 sub2
3 - test2 sub3

这就是我想要显示列表的方式,但我也想对这个排序树进行分页。

最佳答案

这是可能的,但我只能使用两次数据库访问来做到这一点。

主要问题源于无法对节点的子节点设置限制,这会导致节点的子节点被截断或子节点在后续页面上被孤立。

一个例子:

id: 105, Ancestry: Null
id: 117, Ancestry: 105
id: 118, Ancestry: 105/117
id: 119, Ancestry: 105/117/118

A LIMIT 0,3(为了上面的示例)将返回前三个记录,这将渲染除 id:119 之外的所有记录。随后的 LIMIT 3,3 将返回 id: 119,由于其父级不存在,因此无法正确渲染。

我采用的一种解决方案是使用两个查询:

  1. 第一个仅返回根节点。这些可以排序,并且正是这个查询进行分页。
  2. 基于第一个查询发出第二个查询,该查询返回分页父级的所有子级。您应该能够按级别对 child 进行排序。

就我而言,我有一个 Post 模型(其中 has_ancestry)。每个帖子可以有任意级别的回复。另外,一个帖子对象有一个回复计数,这是其直接子对象的缓存计数器。

在 Controller 中:

roots  = @topic.posts.roots_only.paginate :page => params[:page]
@posts = Post.fetch_children_for_roots(@topic, roots)

在 Post 模型中:

named_scope :roots_only, :conditions => 'posts.ancestry is null'

def self.fetch_children_for_roots(postable, roots)
unless roots.blank?
condition = roots.select{|r|r.replies_count > 0}.collect{|r| "(ancestry like '#{r.id}%')"}.join(' or ')
unless condition.blank?
children = postable.posts.scoped(:from => 'posts FORCE INDEX (index_posts_on_ancestry)', :conditions => condition).all
roots.concat children
end
end
roots
end

一些注意事项:

  • 如果使用多个 LIKE 语句,MySQL 将停止使用祖先列索引。 FORCE INDEX 强制 mySQL 使用索引并防止全表扫描
  • LIKE 语句仅针对具有直接子节点的节点构建,因此replies_count 列会派上用场
  • 类方法的作用是将子级附加到 root,这是一个 WillPaginate::Collection

最后,这些可以在您的 View 中进行管理:

  =will_paginate @posts  
-Post.arrange_nodes(@posts).each do |post, replies|
=do stuff here

这里的关键方法是arrange_nodes,它从祖先插件混合到您的模型中。这基本上需要一个排序的节点数组并返回一个排序的分层哈希。

我知道这种方法不能直接解决您的问题,但我希望经过调整的相同方法可以应用于您的案例。

可能有一种更优雅的方法来做到这一点,但总的来说,我对这个解决方案很满意(直到出现更好的解决方案)。

关于ruby-on-rails-3 - Rails 祖先分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6261330/

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