小编She*_*yar的帖子

从Ecto数据库中获取随机记录

是否可以仅使用纯Ecto查询从数据库中获取10个随机记录,而不是在应用程序端?例如,我不想从数据库中获取所有记录,然后在Elixir中获取它们的随机值(如下所示):

Subscribers
|> Repo.all
|> Enum.take_random(10)
Run Code Online (Sandbox Code Playgroud)

postgresql elixir ecto

2
推荐指数
1
解决办法
457
查看次数

如何在Mongoid中获取模型的所有列名称

如何从MongoidRails中的模型中获取所有列名?

ruby mongoid

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

如何在Elixir中加入枚举的字符列表

我正在写一个将RNA转换为DNA的函数。输入以字符列表形式出现:'ATCG'因此我遍历每个字母并使用映射来获取转换后的字母。简单。

问题是枚举字符列表后,我无法将其合并回字符列表。Enum.join返回一个字符串,to_charlist只返回一个字符点列表,我看不到其他任何可以帮助的函数。

这是我的代码:

def to_rna(dna) do
  dna_to_rna = %{
   'G' => 'C',
   'C' => 'G',
   'T' => 'A',
   'A' => 'U'
  }
  Enum.map(dna, fn(letter) ->
    Map.get(dna_to_rna, [letter])
  end)    
end
Run Code Online (Sandbox Code Playgroud)

这将输出一个字符列表: ['U', 'G', 'C']。如何将此列表转换为字符列表:'UGC'

elixir

1
推荐指数
2
解决办法
776
查看次数

Elixir 中的引用函数名称

我现在正在学习 Elixir,我真的很困惑quoteunquote。以下是我们如何使用 a 创建具有动态名称的函数macro

defmacro create_fun(n) do
  quote do: def unquote(:"times_#{n}")(a), do: a * 4
end
Run Code Online (Sandbox Code Playgroud)

times_6例如,如果我6作为宏参数传递,它会创建 function 。

现在我不明白的是:这里我们取消引用atom :"times_#{n}"。Elixir 文档说,当你引用一个原子时,它会返回一个原子。所以当我取消引用一个原子时,我也应该找回这个原子。这是真的:

iex(15)> Macro.to_string quote do: unquote(:"times_6")
":times_6"
Run Code Online (Sandbox Code Playgroud)

但是()在引用之后使用会给出这样的结果:

iex(14)> Macro.to_string quote do: unquote(:"times_6")()
"times_6()"
Run Code Online (Sandbox Code Playgroud)

带括号的原子突然就不再是原子了。如果我unquote(:"times_6"):"times_6"它代替则不起作用:

iex(4)> Macro.to_string quote do: :"times_6"()
** (SyntaxError) iex:4: syntax error before: '('
Run Code Online (Sandbox Code Playgroud)

请问这是怎么回事,没明白

macros function elixir quote

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

如何转换POST body响应以获取元素?

我正在使用HTTPoisonElixir 进行网络请求:

HTTPpoison.post "http://localhost:3000/mymodels"," {\"param1\": \"#{value1}\" ,  \"param2\":\"#{value2}\"} ", [{"Content-Type", "application/json"}] 
Run Code Online (Sandbox Code Playgroud)

这是我得到的回应:

{:ok,
 %HTTPoison.Response{body: "{\"id\":46,\"result\":18,\"param1\":\"liqueur\",\"param2\":\"quif\"}",
  headers: [{"X-Frame-Options", "SAMEORIGIN"},
   {"X-XSS-Protection", "1; mode=block"}, {"X-Content-Type-Options", "nosniff"},
   {"Location", "http://localhost:3000/mymodels/46"},
   {"Content-Type", "application/json; charset=utf-8"},
   {"ETag", "W/\"05b8c75e0a5288c835651f48d4b8a80a\""},
   {"Cache-Control", "max-age=0, private, must-revalidate"},
   {"X-Request-Id", "1e8ae2d3-073a-4779-916a-edffc38f8b5a"},
   {"X-Runtime", "0.530440"}, {"Transfer-Encoding", "chunked"}],
  status_code: 201}}
Run Code Online (Sandbox Code Playgroud)

我是Elixir的新手,我的问题是我想从中得到results元素response.body

iex(3)> response.body           
"{\"id\":46,\"results\":18,\"param1\":\"liqueur\",\"param2\":\"quif\"}"
Run Code Online (Sandbox Code Playgroud)

我不知道如何将此字符串转换为Elixir中的数组/哈希或stuple.我在Enum,但似乎没有用

elixir elixir-poison

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

通过重新为变量赋值来循环Elixir

我想在Elixir中编码这个算法:

var name = generate_name();
while (check_if_exists(name)) {
  name = generate_name();
}
Run Code Online (Sandbox Code Playgroud)

我无法在Elixir中以相同的方式编码,因为必须有更多的惯用和功能方式.那怎么办呢?

loops elixir while-loop

1
推荐指数
2
解决办法
4941
查看次数

在Phoenix中为URL创建查询字符串

在我的Phoenix应用程序中,我想向URL添加查询字符串:

some_cool_path(@conn, :index, "view-mode": "table")
Run Code Online (Sandbox Code Playgroud)

我希望它会生成类似的URL /some_cool?view-mode=table,但会引发异常:

protocol Phoenix.Param not implemented for ["view-mode": "table"]
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

elixir phoenix-framework

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

Elixir如何一次迭代两个列表以生成新列表?

我想一次迭代两个列表,但无法弄清楚如何.for循环,允许你有多个列表作为循环嵌套,我不熟悉Enum,但也许有一个解决方案.

Python有zip(list_1,list_2)enumerate(list_1)做到这一点

在Tcl对我来说更容易:

% foreach var1 [list 1 3] var2 [list 2 4] {
    puts "$var1 $var2"
  }
1 2
3 4
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何在Elixir中做到这一点.

我想这样做的原因是因为我有这样的地图列表

[%{"a" => "1539", "b" => "300"},
 %{"a" => "4095", "b" => "0"},
 %{"a" => "5371", "b" => "0"},
 %{"a" => "7524", "b" => "0"},
 %{"a" => "8267", "b" => "27"}]
Run Code Online (Sandbox Code Playgroud)

我有一个相同大小的项目列表:

["a","b","c","d","e"]
Run Code Online (Sandbox Code Playgroud)

如果地图中的某个元素是某个条件(不是0),我想通过循环一起运行它们来替换地图中的项目:

[%{"a" => "a", "b" => "300"},   # notice the change in element "a"
 %{"a" => "4095", "b" …
Run Code Online (Sandbox Code Playgroud)

enumeration elixir

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

如何在phoenix中配置重新编译

我正在使用 phoenix 创建服务器并使用编辑器 VSCode。

当我启动 server:mix phx.server并且我更改了代码时,它不会重新编译,我必须关闭并再次运行。

应该在可以自动重新编译的地方设置扩展或配置吗?

文件dev.exs

config :jwtuser, Jwtuser.Endpoint,
  http: [port: 5000],
  debug_errors: true,
  code_reloader: true,
  check_origin: false,
  watchers: [node: ["node_modules/brunch/bin/brunch", "watch", "--stdin",
                    cd: Path.expand("../assets", __DIR__)]]
Run Code Online (Sandbox Code Playgroud)

mix.exs 中

def project do
    [
      app: :jwtuser,
      version: "0.0.1",
      elixir: "~> 1.4",
      elixirc_paths: elixirc_paths(Mix.env),
      compilers: [:phoenix, :gettext] ++ Mix.compilers,
      start_permanent: Mix.env == :prod,
      aliases: aliases(),
      deps: deps(),
      erlc_options: erlc_options()
    ]
  end
Run Code Online (Sandbox Code Playgroud)

elixir-mix elixir phoenix-framework

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

下个月到达Elixir

Aleksei回答的最后一个问题中,我试图查找给定日期的上个月。现在,我正尝试做相反的事情:

defmodule Dating do
  def next_month(%Date{year: year, month: month, day: day} = date) do
    first_day_of_next_month = Date.add(date, Calendar.ISO.days_in_month(year, month) - day + 1)
    %{year: year, month: month} = first_day_of_next_month
    Date.add(first_day_of_next_month, min(day, Calendar.ISO.days_in_month(year, month)) - 1)
  end
end
Run Code Online (Sandbox Code Playgroud)

尽管代码可以正常运行,但我希望有更好的方法可以做到这一点:

iex|1 ? Dating.next_month(~D[2018-12-31])
#? ~D[2019-01-31]
iex|2 ? Dating.next_month(~D[2018-02-28])
#? ~D[2018-03-28]
iex|3 ? Dating.next_month(~D[2018-01-31])
#? ~D[2018-02-28]
iex|3 ? Dating.next_month(~D[2018-01-30])
#? ~D[2018-02-28]
Run Code Online (Sandbox Code Playgroud)

注意:请不要建议使用第三方Elixir软件包

erlang datetime calendar date elixir

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