【问题标题】:ordering through an has_many relationship with a condition in rails 3 / active records / postgresql通过 has_many 关系与 rails 3 / active records / postgresql 中的条件进行排序
【发布时间】:2013-08-20 07:06:23
【问题描述】:

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

我有一个选择的“项目”,我想根据它所附加的分类节点的字母顺序来订购,但仅限于一个特定的“顶级父”,其 ID 已提供(如“我想使用此父级按字母顺序排序")。如果我正确理解了嵌套集,您可以找出一个 taxonomy_node 是否属于某个父节点,当它的左右值在顶部父节点的左右值“内”时:例如左侧值的顶部节点“蔬菜” :1 和右:10 的值“土豆”左:2 和右: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 不太熟悉,想知道是否可以编写一个函数来尝试实现这个结果?

希望这很清楚!

【问题讨论】:

  • sort the list of items by one of the main taxonomies 不是一个精确的描述。另外:只有一层嵌套?如果不是,那么如何使用lftrght 来准确识别顶部节点?
  • 抱歉,如果不清楚:基本上我有一些“项目”,我想根据它所附加的分类节点的字母顺序来订购,但仅限于一个特定的“顶部”父”,其 ID 已提供(如“我想使用此父级按字母顺序排序”)。如果我正确理解了嵌套集,您可以找出一个 taxonomy_node 是否属于某个父节点,当它的左右值在顶部父节点的左右值“内”时:例如左侧值的顶部节点“蔬菜” :1 和右:10 的值“土豆”左:2 和右:8 作为一个孩子。
  • 好的,我想我了解您的嵌套集是如何工作的。但是您要查找的排序顺序尚未明确定义(或者我不明白)。您只想考虑属于指定“顶级父级”的taxonomy_nodes。如果一个项目没有链接到该父级下的分类怎么办?如果有多个呢?那怎么排序呢?也请编辑您的问题与这些澄清。公众很难从 cmets 拼凑起来。
  • 抱歉,我会正确编辑它

标签: ruby-on-rails postgresql rails-activerecord


【解决方案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

【讨论】:

  • 哇,非常感谢 erwin,我会试一试并通知您 - 感谢您抽出宝贵时间查看此内容!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 2010-11-02
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多