我试图在for-each循环中设置User模型的一些属性,但是我一直在跟踪错误
无法调用远程函数x.token/0匹配 (elixir)src/elixir_fn.erl:9:匿名fn/3 in:elixir_fn.translate/3(stdlib)lists.erl:1353 :: lists.mapfoldl/3(elixir) )src/elixir_fn.erl:14 :: elixir_fn.translate/3
方法:
Enum.each(users, fn(user) ->
user.token = Comeonin.Bcrypt.hashpwsalt(to_string(user.id))
end)
Run Code Online (Sandbox Code Playgroud) 我正在尝试将Guardian实现到我的API中并通过它执行登录以获得JWT.我正在看的教程就在这里.问题是使用类似于他们在示例中使用的用户模型实现登录.Model代码如下所示:
defmodule PushflightServer.User do
use PushflightServer.Web, :model
use Ecto.Repo
import Ecto.Query
alias PushflightServer.Repo
schema "users" do
field :name, :string
field :email, :string
field :encrypted_password, :string
field :password, :string, virtual: true
field :verify_token, :string
field :verify_date, Ecto.DateTime
timestamps
end
def from_email(nil), do: { :error, :not_found }
def from_email(email) do
IO.write("Before email")
IO.inspect(email)
Repo.one(User, email: email)
end
Run Code Online (Sandbox Code Playgroud)
如果我从Phoenix内部或直接在iex -S mix中调用from_email,我会收到以下错误:
user = PushflightServer.User.from_email("rob@json.com")
**(Protocol.UndefinedError)协议Ecto.Queryable没有为User实现,给定的模块不存在(ecto)lib/ecto/queryable.ex:33:Ecto.Queryable.Atom.to_query/1(ecto)lib/ecto /repo/queryable.ex:90:Ecto.Repo.Queryable.execute/5(ecto)lib/ecto/repo/queryable.ex:15:Ecto.Repo.Queryable.all/4(ecto)lib/ecto/repo /queryable.ex:44:Ecto.Repo.Queryable.one/4
我必须遗漏一些简单的东西,但我无法找到有关为什么会发生这种情况的任何文档.使用Repo插入数据工作正常.有任何想法吗?
我是凤凰城/ 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) 我正在开发一个带有由Phoenix支持的Web界面的应用程序,我正在探索当前SQLite(及其Ecto驱动程序)的替代存储方法(是的,我听说过PGSQL,不,我不愿意使用它.)
我想使用LevelDB和H2LevelDB,它在Github上有一个Erlang驱动程序
然而,在编译时我意识到Phoenix似乎很依赖Ecto,即使在负责渲染eex模板的模块中也是如此.我发现有点可怕,有点奇怪,同时有点烦人.那么,从预先生成的文件中盲目地清除对Ecto的所有引用是否安全,或者我应该为我的Web UI切换到其他内容?
我在尝试创建数据库时遇到错误.我安装了postgres,我已经成功完成了一些测试项目.而且,我没有看到这个错误.任何帮助都会很棒:
错误:
~/Desktop/elixir/restore $ mix ecto.create
** (Mix) The database for Restore.Repo couldn't be created: tcp connect: connection refused - :econnrefused
21:52:23.978 [error] GenServer #PID<0.150.0> terminating
** (Postgrex.Error) tcp connect: connection refused - :econnrefused
(db_connection) lib/db_connection/connection.ex:148: DBConnection.Connection.connect/2
(connection) lib/connection.ex:623: Connection.enter_connect/5
(stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
Last message: nil
State: Postgrex.Protocol
Run Code Online (Sandbox Code Playgroud) 我想在没有第三方库的情况下获得Phoenix/Elixir的当前日期时间戳.或者简单地说,我想要类似的东西DateTime.now().我怎样才能做到这一点?
如何在我计划与Ecto一起运行的查询中使用递归CTE的结果?例如,假设我有一个表,节点,结构如下:
-- nodes table example --
id parent_id
1 NULL
2 1
3 1
4 1
5 2
6 2
7 3
8 5
Run Code Online (Sandbox Code Playgroud)
我还有另一个表nodes_users结构如下:
-- nodes_users table example --
node_id user_id
1 1
2 2
3 3
5 4
Run Code Online (Sandbox Code Playgroud)
现在,我想抓住具有特定节点或其上方节点的所有用户,为了示例,我们选择具有id 8的节点.
我可以使用以下递归postgresql查询来执行此操作:
WITH RECURSIVE nodes_tree AS (
SELECT *
FROM nodes
WHERE nodes.id = 8
UNION ALL
SELECT n.*
FROM nodes n
INNER JOIN nodes_tree nt ON nt.parent_id = n.id
)
SELECT u.* FROM users u
INNER …Run Code Online (Sandbox Code Playgroud) 我想执行如下查询:
SELECT id, name
FROM mytable
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')
Run Code Online (Sandbox Code Playgroud)
FIELD是MySQL特定的函数,'B', 'A', 'D', 'E', 'C'是来自List的值.
我尝试使用片段,但它似乎不允许仅在运行时中知道动态arity.
除了使用完全原始使用Ecto.Adapters.SQL.query,有没有办法使用Ecto的查询DSL处理这个?
编辑:这是第一个天真的方法,当然不起作用:
ids = [2, 1, 3] # this list is of course created dynamically and does not always have three items
query = MyModel
|> where([a], a.id in ^ids)
|> order_by(fragment("FIELD(id, ?)", ^ids))
Run Code Online (Sandbox Code Playgroud) 我有两个型号,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) 我无法成功运行 Ecto 迁移来删除唯一索引,该索引在最初创建时已提供:name属性的唯一索引(以便不使用默认索引名称)。但是,我现在无法删除该索引,因为 Ecto 似乎正在尝试查找名称不正确的索引(尽管我已经提供了它)。
唯一索引最初是通过迁移创建的,如下所示:
def change do
create(
unique_index("foo", [:bar_id],
where: "rejected IS NULL AND accepted IS NULL)",
name: :bar_pending_index
)
)
end
Run Code Online (Sandbox Code Playgroud)
当我检查 psql shell 中的表时,我看到该索引列出为:
"bar_pending_index" UNIQUE, btree (bar_id) WHERE rejected IS NULL AND accepted IS NULL
Run Code Online (Sandbox Code Playgroud)
为了删除索引,我编写了以下迁移:
def up do
drop index("foo", [:bar_pending_index])
end
def down do
create(
unique_index("foo", [:bar_id],
where: "rejected IS NULL AND accepted IS NULL)",
name: :bar_pending_index
)
)
end
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行此迁移时,出现错误
14:01:56.573 [info] == Running 20210610173741 MyApp.Repo.Migrations.DropIndex.up/0 forward
14:01:56.576 [info] …Run Code Online (Sandbox Code Playgroud)