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