luz*_*zny 1 elixir ecto phoenix-framework
我有字段名称列表,例如.[:type, :car_id]和changeset我想从每个字段获取数据作为范围.如何and在从字段列表创建的每个表达式之间构建动态where子句,我可以在之前创建的表达式中进行插值吗?
不是动态的例子:
def scoped_query(query, changeset, fields_names) do
type_field = List.first(fields_names)
car_id_field = List.last(fields_names)
scope1 = get_field(changeset, type_field)
scope2 = get_field(changeset, car_id_field)
query |> where([m], field(m, ^type_field) == ^scope1 and field(m, ^car_id_field) == ^scope2)
end
Run Code Online (Sandbox Code Playgroud)
由于您想要比较==并加入它们and,您只需传递一个关键字列表即可where使用Ecto 2.0+中的Bindingless Queries:
def scoped_query(query, changeset, fields_names) do
criteria = for field <- fields_names, do: {field, get_field(changeset, field)}
query |> where(^criteria)
end
Run Code Online (Sandbox Code Playgroud)