Как сделать настраиваемый «порядок» для отношения «многие к одному» с самим собой в Elixir или SQLAlchemy? - PullRequest
0 голосов
/ 02 февраля 2012

У нас есть узел сущности:

class Node(Entity):
    parent = ManyToOne('Node')
    children = OneToMany('Node')

Когда мы делаем запрос следующим образом:

nodes = (
    Node.query
    .options(
        eagerload(Node.children),
    )
    .order_by(desc(Node.id))
    .all()
)

fathers = [n for n in nodes if n.parent == None]

, мы получаем довольно упорядоченных отцов, в отличие от их детей.(отцы [0] .children возвращает несортированный список узлов)

Почти идеальное решение этой проблемы - добавить параметр "order_by" в поле "children" в Node.Примерно так:

class Node(Entity):
    parent = ManyToOne('Node')
    children = OneToMany('Node', order_by='-id')

А теперь наши дети отсортированы и все хорошо, но ... Что если мы хотим изменить критерии сортировки?Иногда мы хотим сортировать по «id», иногда - по количеству детей или что-то еще.Теперь наше предыдущее решение выглядит не очень хорошо.

Как мы можем преодолеть это?

1 Ответ

0 голосов
/ 02 февраля 2012

Не уверен, что это за синтаксисы Elixir, но вот что я бы сделал, просто используя SQLAlchemy. Я бы сделал функцию, которая вызывает детей не вашим методом по умолчанию:

class Node(...):
    def get_children(self, order='new'):
        if order == 'new':
            orderby = Node.created.desc()
        elif order == 'old':
            orderby = Node.created.asc()
        return DBSession.query(Node).filter(Node.parent_id == self.id).order_by(orderby).all()
...