Phoenix / Ecto - 查询具有零值的单个记录

时间:2017-04-27 23:33:22

标签: phoenix-framework ecto

在我的凤凰应用程序中,我想为单个记录运行get_by() Ecto查询 - 但是,我要搜索的其中一个字段应评估为nil,但Phoenix / Ecto禁止使用nil作为比较运算符。

这是我的理想(但失败)查询:

target_record = Repo.get_by(Records, %{user_id: user_id, deleted_at: nil})

我可以在查询许多记录时使用nil查询is_nil(field_name)个字段,例如:

target_records = from(r in Records,
                        where: r.user_id == ^user_id,
                        where: is_nil(r.deleted_at))
                        |> Repo.all()

但是我不愿意将它用于我当前的任务,因为这将返回一个列表...我的Records表可以有许多具有相同user_id的条目,但只有一个条目将永远有deleted_at: nil,所以我不需要取回一个项目列表然后将其转换成地图......

我的意思是,我可以这样做,但它看起来不太干净。

如何安排get_by查询以便包含nil值?

1 个答案:

答案 0 :(得分:6)

const webgl2Header = `#version 300 es #define texture2D texture #define textureCube texture `; const webglHeader = ` #define in varying #define out varying `; function prepShader(gl, source) { const isWebGL2 = gl.texImage3D !== undefined const header = isWebGL2 ? webgl2Header : webglHeader; return header + source; } const vs = ` in vec4 position; in vec2 texcoord; out vec2 v_texcoord; uniform sampler2D u_tex; uniform mat4 u_matrix; void main() { gl_Position = u_matrix * (position + texture2D(u_tex, texcoord)); v_texcoord = texcoord; } `; const vsSrc = prepSource(gl, vs); Repo.get非常适合非常简单的查询。但是,当您需要超越自己的能力时,您需要进入Repo.get_by API。使用此API构建的查询可与Ecto.QueryRepo.oneRepo.one!一起使用。请注意,Repo.all如果获得的记录超过1,则会提升。

所以,这应该有效:

Repo.one

可以写成:

target_records = 
  from(r in Records, where: r.user_id == ^user_id and is_nil(r.deleted_at))
  |> Repo.one()