标签: ecto

如何在Ecto Query中创建条件连接?

我有2个模型 - 用户和ApiKey(用户has_many api_keys),我正在尝试创建条件连接.我的意思是我想用他的活跃ApiKeys加载单个查询用户.我目前的代码看起来像

query = from u in User, 
        join: a in assoc(u, :api_keys), 
        where: u.email == ^email,
        preload: [api_keys: a]
user = Repo.one(query)
Repo.preload user, api_keys: (from a in ApiKey, where: a.is_active == true)
Run Code Online (Sandbox Code Playgroud)

但不幸的是,我发现 - 预加载方法无法在数据已预加载时更改api_keys的集合.

你能告诉我一个很好的例子吗 - 如何预加载"活跃的"api_keys?

elixir ecto phoenix-framework

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

如何编写在日期时间字段上执行group_by MONTH的Ecto查询

我正在做一个ecto查询,我正在尝试分组q.created_date.此查询成功执行GROUP BY,但它在第二次执行.我试图按月分组.

MYQUERY |> group_by([q], [q.created_date, q.id])
Run Code Online (Sandbox Code Playgroud)

是否有类似的东西:

MYQUERY |> group_by([q], [month(q.created_date), q.id])
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

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

无法删除模型-函数Ecto.Query .__ changeset __ / 0未定义或私有

我正在尝试删除一个项目及其所有子项:

where(ParentModel, [x], x.user_id == 123)
|> first
|> Repo.delete()

# or
# Repo.delete(where(ParentModel, [x], x.user_id == 123))
Run Code Online (Sandbox Code Playgroud)

两者都抛出异常:

function Ecto.Query.__changeset__/0 is undefined or private
Run Code Online (Sandbox Code Playgroud)

它与验证有什么关系?

在父模型中,我有 on_delete: :delete_all

elixir ecto phoenix-framework

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

Elixir/Phoenix无法连接到云托管的Postgres DB

试图让我的第一个Phoenix应用程序连接到Compose的Cloud Hosted Postgres DB并且无法连接.我已经确认它已启动并正在运行.我收到以下错误:

[error] GenServer #PID<0.178.0> terminating
** (DBConnection.ConnectionError) tcp connect (postgres://*****@aws-us-east-1-portal.5.dblayer.com:16786/compose:5432): non-existing domain - :nx
domain
    (db_connection) lib/db_connection/connection.ex:148: DBConnection.Connection.connect/2
    (connection) lib/connection.ex:622: Connection.enter_connect/5
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
Last message: nil
State: Postgrex.Protocol
** (Mix) The database for HelloPhoenix.Repo couldn't be created: an exception was raised:
    ** (DBConnection.ConnectionError) tcp connect (postgres://****@aws-us-east-1-portal.5.dblayer.com:16786/compose:5432): non-existing domain -
:nxdomain
        (db_connection) lib/db_connection/connection.ex:148: DBConnection.Connection.connect/2
        (connection) lib/connection.ex:622: Connection.enter_connect/5
        (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
Run Code Online (Sandbox Code Playgroud)

这些是我的依赖:

defp deps do
  [{:phoenix, "~> 1.2.1"},
  {:phoenix_pubsub, "~> 1.0"},
  {:phoenix_ecto, "~> 3.0"},
  {:postgrex, ">= 0.0.0"},
  {:phoenix_html, …
Run Code Online (Sandbox Code Playgroud)

postgresql elixir ecto phoenix-framework

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

在Phoenix Framework中截断文本

我有一个名为内容的文本字段,需要显示其摘录。

做这个的最好方式是什么?

就像是:

<% post.content.slice(0..50) %>
Run Code Online (Sandbox Code Playgroud)

我的想法是 但是,这给了我一个参数错误。

显示内容文本字段的前50个字符的最佳方法是什么?

或者-在将数据创建/保存到数据库后是否可以创建摘录字段?

任何帮助表示赞赏。提前致谢。

elixir ecto phoenix-framework

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

查询记录中的ID - Phoenix和Elixir

我来自铁轨背景(像许多Elixir人一样).我目前的问题是我正在尝试查询特定记录.对于我来说,这对我来说毫无疑问,但我似乎无法在凤凰城找到它.这是我正在尝试做的事情:

我有一个Locationhas_many表,MonitorsMonitor有一个不是ID的数字.这些号码只对一个位置是唯一的,所以我不能简单地找到只有监视器编号的特定监视器.所以我必须将它范围扩展到它所属的位置.在Rails中我会做这样的事情:

location = Location.find(params[:location_id])

monitor = location.monitors.find_by(number: params[:monitor_number])
Run Code Online (Sandbox Code Playgroud)

使用Rails活动记录很容易,但我怎样才能与凤凰城一起做?这是我目前的尝试没有按照我的预期运作.

monitor_query = from m in Monitor,
  where: m.location_id == ^upload_params["location_id"],
  where: m.number == ^upload_params["monitor_number"],
  select: m.id

monitor = Repo.all(monitor_query)
Run Code Online (Sandbox Code Playgroud)

这是错误的ID,我不确定它在做什么.任何人都可以告诉我这个吗?

ruby-on-rails elixir ecto phoenix-framework

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

如何在使用ecto加入时返回选择值

我正在使用ecto 2.2.6.

我正试着通过ecto离开加入.

首先,我使用List来返回带有单个表的选择值.(1)

接下来,由于表连接,我使用Map返回选择值.(2)

Repo.all(from m in "members",
    left_join: g in "groups",
           on: g.id == m.group_id,
        where: g.id == ^group_id
# select: [:id, :group_id, :name, :group_name] #(1)
# select: {m.id, m.group_id, m.name, g.group_name} #(2)
)
Run Code Online (Sandbox Code Playgroud)

我想用HTML制作选择框.它不起作用,因为我使用Map时没有键.

<%= select f, :group_id, Enum.map(@groups, &{&1.group_name, &1.group_id}) %>
Run Code Online (Sandbox Code Playgroud)

我该如何选择并使用选择值?我想知道如何通过ecto返回选择值,并通常在选择框中重新显示.

elixir ecto phoenix-framework

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

测试Elixir/Ecto日期

我在Elixir和Phoenix测试时遇到了另一个问题.我有一个代表用户的模块,如下所示:

defmodule AppExample.Accounts.User do
  use Ecto.Schema
  import Ecto.Changeset
  alias SecuritytrailsApi.Accounts.User

  schema "users" do
    field :email, :string
    field :password, :string, virtual: true
    field :password_hash, :string
    field :last_login, :naive_datetime

    timestamps()
  end

  ...
  def registration_changeset(%User{} = user, attrs \\ %{}) do
    user
    |> changeset(attrs) # validating and castnig email
    |> validate_required([:password])
    |> put_password_hash # creates password hash from password
    |> set_default_date
  end

  defp set_default_date(chanegset) do
     case changeset do
       %Ecto.Changeset{valid?: true} ->
          put_change(changeset, :last_login, Ecto.DateTime.utc)
       _ -> changeset
     end
  end
end
Run Code Online (Sandbox Code Playgroud)

让我们说我有一个帐户上下文,负责创建新帐户.像这样: …

unit-testing elixir ecto phoenix-framework

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

构建自定义查询和嵌套关联定义

我正在尝试将has_many关联预加载到传入的结构和传递的结构关联的has_many关联.

以下是我现在正在使用的内容:

project =
 Repo.get!(Project, id)
 |> Repo.preload([rows: {query, [images: from i in Image, order_by: i.index]}])
Run Code Online (Sandbox Code Playgroud)

但是这会返回此错误:

This error may happen when you forget a comma in a list or other container:

    [a, b c, d]

Elixir cannot compile otherwise. Syntax error before: ','
Run Code Online (Sandbox Code Playgroud)

这虽然工作得很好:

project =
  Repo.get!(Project, id)
  |> Repo.preload([rows: {query, [:images]}])
Run Code Online (Sandbox Code Playgroud)

但在这个查询中,我无法按照我想要的图像进行排序.任何人都可以帮我吗?

elixir ecto phoenix-framework

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

ECTO unique_constraint无法按预期工作

我想创建一个包含3个字段的unique_constraint,并将其称为“ unique_user_product_shop”。当我这样做时,我的数据库抛出一个错误,表明尝试的插入不是唯一的:

错误:

18:04:18.830 [error] #PID<0.380.0> running Api.Router terminated
Server: 192.168.1.12:4000 (http)
Request: PUT /product/isinshop/?p_id=12&s_id=12&u_id=792200324272726
** (exit) an exception was raised:
    ** (FunctionClauseError) no function clause matching in Ecto.Changeset.add_constraint/6
        (ecto) lib/ecto/changeset.ex:2272: Ecto.Changeset.add_constraint(#Ecto.Changeset<action: nil, changes: %{p_id: 12, s_id: 12, u_id: "792200324272726", voted_in_shop: true, voted_not_in_shop: false}, errors: [], data: #Api.UserProductShop<>, valid?: true>, :unique, "unique_user_product_shop", :exact, [:p_id, :u_id, :s_id], {"has already been taken", []})
        (api) lib/api/models/user_product_shop.ex:37: Api.UserProductShop.insert_user_product_shop/2
        (api) lib/api/controllers/product/put_product_is_in_shop.ex:48: Api.Controllers.PutProductIsInShop.put_product_is_in_shop/1
        (api) lib/api/router.ex:1: Api.Router.plug_builder_call/2
        (api) lib/plug/debugger.ex:123: Api.Router.call/2
        (plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
        (cowboy) /Users/Ben/Development/Projects/vepo/api/deps/cowboy/src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4
Run Code Online (Sandbox Code Playgroud)

我的代码: …

elixir ecto

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