我有两个对象,项目和分类法节点。
我根据附加的taxonomy_nodes的字母顺序选择了我要订购的“商品”,但仅限于提供其ID的特定“顶级父母”(如“我想要”按字母顺序排序使用此父级“)。如果我正确理解嵌套集,您可以查看taxonomy_node是否属于某个父级,当它的左右值在顶级父级的左右值“内”时:例如,左侧值的顶级节点“vegetable” :1和右:10有剩下的“马铃薯”值:2和右:8岁时。
一个项目可以有几个taxonomy_nodes,我使用awesome_nested_set gem来使taxonomy_nodes的行为类似于具有层次结构的嵌套集合。因此,我可以有各种主要的“分类法”,项目被标记,由它们的“顶级节点”识别。
目前,识别taxonomy_node是否属于特定“顶级节点”的唯一方法是使用taxonomy_node的lft和rght值,这是我在尝试允许我时遇到绊脚石的地方用户按主要分类法之一对项目列表进行排序。
我认为实现这一目标的唯一方法是允许在排序中使用“条件”,但实际上不可能如何实现!
使用更简单的字段(例如“item_template”)进行排序很容易实现:
@items.joins(:item_template).includes(:item_template}.order("template_name #{sorting_direction}")
以下是分类表:
Table name: taxonomies
id :integer not null, primary key
name :string(255)
parent_id :integer
lft :integer
rgt :integer
created_at :datetime not null
updated_at :datetime not null
depth :integer
分类法通过ItemTaxonomy对象与项目相关。我对PostgreSQL并不是很熟悉,并且想知道我是否可以编写一个函数来尝试实现这个结果?
希望这很清楚!
答案 0 :(得分:1)
更新后的新版本。
您可以将您的项目加入其分类中,并且分类法必须位于“顶级父级”的范围内 - 这可以作为另一个JOIN
实施。也可以是WHERE
子句中的表达式。
假设嵌套集模型按照更新的描述,其中lft
& right
在上级节点的范围内。
还假设:
SELECT t.name, i.*
FROM item AS i
JOIN taxonomy_node AS tn ON tn.item_id = i.id -- assuming, no specification
JOIN taxonomies AS t ON t.id = tn.taxonomy_id -- assuming ...
JOIN taxonomies AS parent ON parent.lft <= t.lft
AND parent.rght >= t.rght
WHERE parent.id = ? -- id of "top parent" here
ORDER BY t.name