我正在尝试为网站 (PHP/MySQL) 创建一个评论部分,用户可以在其中发表评论 或回复已发布的。我了解到这有点棘手,因为 诸如 MySQL 之类的 RDBMS 并不是真正为存储分层数据而创建的。 我找到了 4 种解决方案(邻接表、路径枚举、嵌套集和闭包表) 其中我选择了嵌套集(修改后的预序树遍历)。 我已经成功地完成了对根评论和他们的回复进行提取和排序的工作 但我似乎无法找到一种方法来按点(其他列)对评论进行排序而不中断 父>子链接。
想象一下这样的表格:
+-------------------------------+
| id | comment | lft | rgt | pts|
+-------------------------------+
+-------------------------------+
| 1 | abc | 1 | 8 | 3 |
+-------------------------------+
| 2 | 123 | 2 | 7 | 1 |
+-------------------------------+
| 3 | xyz | 3 | 4 | 5 |
+-------------------------------+
| 4 | www | 5 | 6 | 4 |
+-------------------------------+
| 5 | com | 9 | 10 | 9 |
+-------------------------------+
如果我通过“lft ASC”订购 我得到标准的时间顺序(从旧到新):
(1) abc
--(2) 123
----(3) xyz
----(4) www
(5) com
如果按“rgt DESC”排序 我得到相反的结果,即先是新的(从新到旧):
(5) com
(1) abc
--(2) 123
----(4) www
----(3) wxy
所有这些都非常有效。 问题是我似乎无法找到一种方法来按点对评论进行排序。 最终我想得到这样的订单:
(5) com (9 pts)
(1) abc (3 pts)
--(2) 123 (1 pts)
----(3) xyz (5 pts)
----(4) www (4 pts)
有没有办法让嵌套集模型的行为像这样。 如果可能的话,最好的方法是使用正确的查询,但如果这样的查询不 存在用 PHP 订购它们也是可以接受的(如果它使用合理的资源)。 如果使用嵌套集模型这不太可能,我想知道 使用哪种模型来生成对上述评论进行排序的所有方式。
最佳答案
我相信这归结为获取深度,然后按深度排序,然后按点排序。
SELECT
c.*,
(COUNT(p.id) - 1) AS depth
FROM
comments AS c
LEFT JOIN comments AS p ON c.lft BETWEEN p.lft AND p.rgt
GROUP BY c.id
ORDER BY depth, c.pts DESC
将产生:
id comment lft rgt pts depth
5 com 9 10 9 0
1 abc 1 8 3 0
2 123 2 7 1 1
3 xyz 3 4 5 2
4 www 5 6 4 2
关于php - 按另一列排序嵌套集(lft 和 rgt 除外),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9315387/
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir
我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
我在一个静态网站上工作(因此没有真正的服务器支持),我想在另一个网站中包含一个小的细长片段,可能会向它传递一个变量。这可能吗?在rails中很容易,虽然是render方法,但我不知道如何在slim上做(显然load方法不适用于slim)。 最佳答案 Slim包含Include插件,允许在编译时直接在模板文件中包含其他文件:require'slim/include'includepartial_name文档可在此处获得:https://github.com/slim-template/slim/blob/master/doc/incl