0

我有两个对象,项目和分类节点。

我有一个选择的“项目”,我想根据它所附加的分类节点的字母顺序来排序,但仅限于一个特定的“顶级父”,其 ID 被提供(如“我想按字母顺序排序使用这个父母”)。如果我正确理解了嵌套集,您可以找出一个 taxonomy_node 是否属于某个父级,而它的左右值在顶部父级的左右值“内”:例如左侧值的顶部节点“蔬菜” :1 和 right: 10 的“土豆”值 left: 2 和 right: 8 作为一个孩子。

一个项目可以有多个分类节点,我正在使用 awesome_nested_set gem 来让分类节点表现得像具有层次结构的嵌套集。因此,我可以有各种主要的“分类法”来标记项目,由它们的“顶部节点”标识。

目前,识别分类节点是否属于特定“顶级节点”的唯一方法是使用分类节点的 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 不太熟悉,想知道是否可以编写一个函数来尝试实现这个结果?

希望这很清楚!

4

1 回答 1

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
于 2013-08-20T08:01:23.720 回答