0

Elixir の使用に行き詰まっており、現在、改善したいデータベースを検索する方法が非常に面倒です。ドキュメンテーションは、基本的なジェネレーティブ検索を行う方法についての洞察を提供しますが、私は多くの異なるクラスをステップ実行する必要があり、自分でリストをスキャンするよりも Elixir を使用したいと考えています。

次に例を示します。

Class Student:
hobby = Field(String)
additional_info = OneToOne('AdditionalInformation', inverse='student')
user_profile = OneToOne('UserProfile', inverse='student')

Class AdditionalInformation:
 state = Field(String)
 city = Field(String)
 student = OneToOne('Student', inverse='additional_info')

Class UserProfile:
 username = Field(String)
 date_signed_up = Field(DateTime)
 student = OneToOne('Student', inverse = 'user_profile')

この例では、次のすべての学生を見つけたいと考えています。

  1. 2008年以降に登録
  2. カリフォルニア出身です
  3. 「テレビゲーム」を趣味にする

私が行く方法があるはずだと思っています:

result = UserProfile.query.filter_by(date_signed_up>2008)
result.query.filter_by(UserProfile.student.hobby='blabla')
result.query....

現在、それらをリストに入れてセットを探しています。

4

1 に答える 1

0

Elixir は使用していませんが、SQLAlchemy は使用しています。現在の設定を考えると、あなたが望むことはできないと思います。私の知る限り、関係で直接フィルタリングする方法はありません。

あなたが新しいテーブルを作成しているのか、既存のテーブルを扱っているのかは不明です。そのため、いくつかの情報を提供し、その一部が役立つことを願っています.

SQLAlchemy でテーブルを結合できます (UserProfile に student_id という外部キーがあると仮定します)。これにより、2008 年以降にサインアップしたすべての学生が得られます。

result = Student.query.join(UserProfile).filter(Student.id==UserProfile.student_id).filter(UserProfile.date_signed_up>2008).all()

上記のように .filter() を連鎖させるか、複数の引数を渡すことができます。これは、検索フォームから取得するような、不明な数のフィルターを処理する場合に特に便利です。

conditions = [UserProfile.date_signed_up>2008] 

if something_is_true:
  conditions.append(UserProfile.username=="foo")

result = Student.query.join(UserProfile).filter(Student.id==UserProfile.student_id).filter(and_(*conditions)).all()

ハイブリッド プロパティでできるもっと複雑なこともありますが、ここでは適切ではないようです。

于 2012-12-20T20:06:33.000 に答える