我来自铁轨背景(像许多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,我不确定它在做什么。任何人都可以告诉我这个吗?
答案 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
获取该记录。