通过has_many关系与rails 3 / active records / postgresql中的条件进行排序

时间:2013-08-20 07:06:24

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

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

我根据附加的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并不是很熟悉,并且想知道我是否可以编写一个函数来尝试实现这个结果?

希望这很清楚!

1 个答案:

答案 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