标签: elixir

如何使用Elixir Ecto中的"between"创建SQL

我想使用Elixir Ecto中的关键字"between"创建一个SQL.

我知道如何使用创建一个SQL like

where: like(t.descript, ^some_description)

但是,当我尝试以同样的方式做到这一点 like

where: between(t.start_date, ^start_date, ^end_date),

我收到了"无效"错误信息

** (Ecto.Query.CompileError) `between(t.start_date(), ^start_date, ^end_date)` is not a valid query expression.**
Run Code Online (Sandbox Code Playgroud)

我怎么能以正确的方式做到这一点?

提前致谢!!

between elixir ecto

9
推荐指数
2
解决办法
1738
查看次数

灵药中的宏扩展:如何使用另一个宏定义2个宏?

我在elixir中试验Macros.因此,我即将展示的代码当然应该用简单的函数完成,但是......我正在试验!

我想定义2个宏(A和B)并使A使用B来试验宏扩展.当我使用A时,我收到一个编译错误,说明函数 B 未定义.

这是代码:

defmodule MyMacros do
  defmacro print_expr(expr) do
    quote do
      IO.puts(unquote(expr))
    end
  end

  defmacro print_hashes_around(expr) do
    quote do
      IO.puts "###"
      print_expr(unquote(expr))
      IO.puts "###"
    end
  end
end

defmodule MyModule do
  require MyMacros

  def my_print(expr) do
    MyMacros.print_hashes_around(expr)
  end
end

MyModule.my_print("hello world")
Run Code Online (Sandbox Code Playgroud)

这是编译错误:

macro_test.exs:17: warning: redefining module MyModule
** (CompileError) macro_test.exs:21: function print_expr/1 undefined
(stdlib) lists.erl:1336: :lists.foreach/2
macro_test.exs:17: (file)
(elixir) lib/code.ex:307: Code.require_file/2
Run Code Online (Sandbox Code Playgroud)

我(错)理解事物的方式:

  1. 通过要求MyMacros,模块MyModule应该知道两个宏的存在.因此我应该可以使用任何宏.
  2. 当在MyModule中展开print_hashes_around时,编译器应该发现print_expr也是一个宏.因此,应该进行另一次扩张.
  3. 似乎发生的事情是第二次扩张不会发生.因此,编译器会查找不存在的函数定义.

我对吗 ?

至于建议在农闲,前缀print_exprMyMacros.修复它.我还是不明白为什么.MyModule需要MyMacros这样两个宏都应该是已知的并且可以扩展......当我看到unless …

macros elixir

9
推荐指数
1
解决办法
1000
查看次数

使用Ecto的原始SQL

我是Elixir和Phoenix Framework的新世界.我正在尝试关注TheFireHoseProject教程,但是在使用Ecto查询原始SQL时遇到问题.该教程说这应该工作:

defmodule Queries do
def random do
  query = Ecto.Adapters.Postgres.query(
    Repo,
    "SELECT id, saying, author from quotes ORDER BY RANDOM() LIMIT 1",
    [])
  %Postgrex.Result{rows: [row]} = query
  {id, saying, author} = row
  %Splurty.Quote{id: id, saying: saying, author: author}
end
end
Run Code Online (Sandbox Code Playgroud)

我收到一个运行时错误,即Ecto.Adapters.Postgres.query不存在(未定义的函数).

我试图搜索Ecto文档,发现可能有一个名为run_query的函数,但它也不起作用.

我想我正在使用Ecto 1.1.4并且我没有找到任何关于如何使用Ecto查询原始SQL的好(最新)样本.

firehoseproject的链接是:http://phoenix.thefirehoseproject.com/

elixir phoenix-framework

9
推荐指数
2
解决办法
3257
查看次数

管道中的模式匹配

我要解析一个xml文档,从xml节点中提取一个整数.

目前我有:

try do
  Floki.find(node, "stat[type='jersey_num']")
    |> Floki.text
    |> Integer.parse
    |> elem(0)
rescue
  e -> nil
end
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,但我不喜欢拯救一切,我想做的事情如下:

Floki.find(node, "stat[type='jersey_num']")
  |> Floki.text
  |> case Integer.parse do
    { int, _binary } -> int
    _                -> nil
  end
Run Code Online (Sandbox Code Playgroud)

但我进入unhandled operator ->第四行,有没有办法做到这一点?

elixir

9
推荐指数
1
解决办法
4665
查看次数

HTTPOISON - 在elixir中插入body参数

我正在尝试做一个http请求

def getPage() do
    url = "http://myurl"
    body = '{
              "call": "MyCall",
              "app_key": "3347249693",
              "param": [
                  {
                      "page"          : 1,
                      "registres"     : 100,
                      "filter"        : "N"
                  }
              ]
             }'

    headers = [{"Content-type", "application/json"}]
    HTTPoison.post(url, body, headers, [])
end
Run Code Online (Sandbox Code Playgroud)

这对我很有用.

我的问题是 - 如何在body请求中插入变量.含义:

 def getPage(key, page, registers, filter) do
    url = "http://myurl"
    body = '{
              "call": "MyCall",
              "app_key": key,
              "param": [
                  {
                      "page"          : page,
                      "registres"     : registers,
                      "filter"        : filter
                  }
              ]
             }'

    headers = [{"Content-type", "application/json"}]
    HTTPoison.post(url, body, headers, …
Run Code Online (Sandbox Code Playgroud)

http elixir

9
推荐指数
2
解决办法
5756
查看次数

如何在将Ecto变更集插入仓库之前修改它?

我是凤凰城/ Elixir的新手,我正试图围绕变革集团.

我知道它包含一组用于创建或更新模型的更改.

我想知道的是,在将更改推送到数据库之前,是否以及如何修改更改.

我的用例如下:

  • 我有一个表单,允许人们在数据库中创建新的艺术家.
  • 在这种形式中有一个专业领域.
  • 在创建艺术家之前,我想用","将专业字段拆分为一个字符串数组

由于不变性约束,我甚至不确定是否可以直接修改变更集,但我可以创建另一个变更集以插入仓库.

欢迎任何建议,并毫不犹豫地指出我可能正在做的不良做法或愚蠢的事情!

编辑以下评论:我正在寻找类似的东西:

defp put_specialty_array(changeset) do
  case changeset do
    %Ecto.Changeset{valid?: true, changes: %{specialty: spec}} ->
      put_change(changeset, :specialty, String.split(spec, ","))
    _ ->
      changeset
  end
end
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

9
推荐指数
1
解决办法
4258
查看次数

Elixir Ecto:如何使用belongs_to和has_many编写迁移?

我有两个型号,Person并且Pet,我希望Person能够有很多宠物,但Pet属于只有一个人:

defmodule MyApp.Person do
  use MyApp.Web, :model

  alias MyApp.Pet

  schema "persons" do
    field :name, :string
    has_many :pets, Pet
    timestamps()
  end

  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [])
    |> validate_required([])
  end
end
Run Code Online (Sandbox Code Playgroud)

defmodule MyApp.Pet do
  use MyApp.Web, :model

  alias MyApp.Person

  schema "pets" do
    field :name, :string
    belongs_to :person, Person
    timestamps()
  end

  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [])
    |> validate_required([]) …
Run Code Online (Sandbox Code Playgroud)

postgresql elixir ecto phoenix-framework

9
推荐指数
1
解决办法
1903
查看次数

如何取Elixir中数字的平方根?

如何取Elixir中数字的平方根?似乎没有Math模块或任何东西,并且没有类似的功能sqrt().

elixir

9
推荐指数
2
解决办法
1471
查看次数

如何在Elixir中检查struct的字段类型?

比方说我有:

defmodule Operator do

    defstruct operator: nil 

    @type t :: %Operator {
        operator: oper
    }

    @type oper :: logic | arithmetic | nil
    @type logic :: :or | :and
    @type arithmetic :: :add | :mul 

end
Run Code Online (Sandbox Code Playgroud)

然后我可以:

o = %Operator{operator: :and}
Run Code Online (Sandbox Code Playgroud)

它是可能的,以检查是否o.operatorlogic,arithmetic还是nil

elixir typechecking

8
推荐指数
1
解决办法
1377
查看次数

Elixir中的枚举词

我想在Elixir中创建一个枚举.可能吗?通过枚举我的意思是来自C/C++或Ruby或许多其他语言的枚举.我知道Enum模块,但这只是一个模块 - 基本上是函数的容器.

elixir

8
推荐指数
2
解决办法
4469
查看次数