0

エンティティのいくつかの列を検索可能としてマークしたいと思います。理想的には、列ごとにクリーンな方法で。「タグ付け」したり、クラスの列定義にプロパティを追加したりすることはできますか? コードの他の場所では、具体的にどのクラスであるかを知らなくても、任意のエンティティで検索可能な列を取得できるようにしたいと考えています。

例えば:

class Foo(Entity):
  bar = Field(Integer, default = -1, searchable = True)

..

if foo.bar.searchable:
  # do something

明らかに上記の例は機能しませんが、これを行う方法はありますか? 私はこの分野の専門家ではありません。数日間の検索/ドキュメント トロールでは、何の役にも立ちませんでした。

4

1 に答える 1

0

Monkeypatching は機能しますが (少なくとも sqlalchemy 宣言型モデルでは、Elixir で試したことはありません)、monkeypatching に関するすべての標準的な問題にさらされます (主な問題は、bar への変更が変更されないままであるという保証がないことです)。 . ただし、基本的には機能し、アプリケーションが非常に単純な場合は実行可能なソリューションになる可能性があります.

class Foo(Entity):
    bar = Field(Integer, default=-1)
    bar.searchable = True

アプリケーションがより複雑である場合、および/または長期間にわたって堅牢で信頼性が高く保守可能である必要がある場合、上記の手法は適していません。理想的には、この追加情報を格納するために別のオブジェクトを導入する必要があります。このオブジェクトは完全に制御可能であり、sqlalchemy がデータ モデル クラスに対して行うすべての舞台裏の処理に翻弄されることはありません。

そのためには、多くの方法があります。簡単な選択の 1 つは、必要なときに簡単に検索できるように、追加情報 (ブール値の「検索可能」プロパティと追加したいものすべて) を保持する単純な構造を作成することです。たとえば、ネストされた dict() を使用して、モデル クラス、フィールド名、およびプロパティ名によってインデックス付けされた任意の数の追加プロパティを格納する非常に単純なクラスを定義します。次に、このクラスのインスタンスを 1 つ作成し、アプリ全体で共有します。

このような構造を設定したら、次のように使用できます。

if extra_props[foo]['bar']['searchable']:
    # do something
于 2012-09-20T19:28:49.703 に答える