查询记录中的ID - Phoenix和Elixir

时间:2017-07-26 22:55:17

标签: ruby-on-rails elixir phoenix-framework ecto

我来自铁轨背景(像许多Elixir人一样)。我目前的问题是我正在尝试查询特定记录。对于我来说,这对我来说毫无疑问,但我似乎无法在凤凰城找到它。这是我正在尝试做的事情:

我有一个Location表has_many Monitors,而Monitor有一个不是ID的数字。这些号码只对一个位置是唯一的,所以我不能简单地找到只有监视器编号的特定监视器。所以我必须将它范围扩展到它所属的位置。在Rails中我会做这样的事情:

location = Location.find(params[:location_id])

monitor = location.monitors.find_by(number: params[:monitor_number])

Rails活跃记录很容易,但我怎样才能与凤凰城一起做?这是我目前的尝试,但没有按照我的预期运作。

monitor_query = from m in Monitor,
  where: m.location_id == ^upload_params["location_id"],
  where: m.number == ^upload_params["monitor_number"],
  select: m.id

monitor = Repo.all(monitor_query)

这是错误的ID,我不确定它在做什么。任何人都可以告诉我这个吗?

1 个答案:

答案 0 :(得分:5)

该Rails代码最直接的转换是:

location = Repo.get(Location, params["location_id"])
monitor = Repo.get_by(Ecto.assoc(location, :monitors), number: params["monitor_number"])

Ecto.assoc(location, :monitors)会返回一个基本上from m in Monitor, where: m.location_id == ^location.id的查询。然后我们向其添加更多约束(where: m.number == ^params["monitor"])并使用Repo.get_by获取该记录。