标签: ecto

在凤凰城处理嵌套表格/外部变更集的正确方法是什么?

我正在凤凰城编写一个简单的CRUD应用程序,管理员在创建新组织时可以使用初始员工帐户进行配置.

有效地,组织和用户之间的关系是多对多的.

我想出了以下内容:

  1. 用户架构:

    defmodule MyApp.User do
    use MyApp.Web, :model
    
    schema "users" do
      field :name, :string
      field :email, :string
      field :password, :string, virtual: true
      field :password_hash, :string
    end
    
    def changeset(...) # validate email, password confirmation etc.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 组织架构:

    defmodule MyApp.Org do
      use MyApp.Web, :model
    
      schema "orgs" do
        field :official_name, :string
        field :common_name, :string
    
        has_many :org_staff_users, MyApp.OrgStaffUser
        has_many :users, through: [:org_staff_users, :user]
     end
    
     def changeset(model, params \\ :empty) do
      model
      |> cast(params, ~w(official_name common_name), [])
     end
    
     def provisioning_changeset(model, params \\ :empty) do …
    Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

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

如何使用Ecto使用Postgres的枚举类型

使用PostgreSQL,我们可以这样做:

CREATE TYPE order_status AS ENUM ('placed','shipping','delivered')
Run Code Online (Sandbox Code Playgroud)

Ecto的官方文档来看,没有本地类型可以映射Postgres的枚举类型.此模块为枚举结构提供自定义类型,但它映射到数据库中的整数.我可以轻松地使用该库,但我更喜欢使用数据库附带的本机枚举类型.

Ecto还提供了一种创建自定义类型的方法,但据我所知,自定义类型必须映射到本机Ecto类型...

任何人都知道这是否可以在Ecto的架构中完成?如果是,迁移将如何运作?

postgresql enums elixir ecto

14
推荐指数
6
解决办法
4991
查看次数

Elixir Ecto:如何在变更集中设置belongs_to关联

我有点陷入如何实际设置与变更集的关联.我在我的模型中有这个代码:

defmodule MyApp.MemberApplication do
  use MyApp.Web, :model
  use Ecto.Schema
  use Arc.Ecto.Schema

  alias MyApp.Repo
  alias MyApp.MemberApplication

  schema "applications" do
    field :name, :string
    field :email, :string
    field :time_accepted, Ecto.DateTime
    field :time_declined, Ecto.DateTime
    belongs_to :accepted_by, MyApp.Admin
    belongs_to :declined_by, MyApp.Admin

    timestamps()
  end

  def set_accepted_changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:time_accepted, :accepted_by_id])
    |> cast_assoc(params, :accepted_by)
    |> set_time_accepted
  end

  defp set_time_accepted(changeset) do
    datetime = :calendar.universal_time() |> Ecto.DateTime.from_erl
    put_change(changeset, :time_accepted, datetime)
  end
end
Run Code Online (Sandbox Code Playgroud)

我想保存一个关联Admin执行某个操作(接受或拒绝member_application)和时间戳.时间戳的生成有效,但是当我尝试保存关联时,我总是得到错误

** (FunctionClauseError) no function clause matching in Ecto.Changeset.cast_assoc/3
Run Code Online (Sandbox Code Playgroud)

这就是我想要设置关联的方式: …

elixir ecto

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

如何在Elixir中获得与Ecto的"belongs_to"关联?

我有一个帖子和评论模型.一篇帖子有很多评论,一篇评论属于帖子.

在显示个人评论时,如何访问其所属的帖子?

即在Ruby on Rails中你可以做到:

@comment = Comment.find(params[:id])
@post = @comment.post
Run Code Online (Sandbox Code Playgroud)

我怎样才能使用Phoenix Elixir框架实现这一目标?我相信我已正确设置了模型关联,但我对如何在视图或控制器中实际获取此查询感到困惑.

elixir ecto phoenix-framework

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

Phoenix框架 - 自定义变更集验证

我真的很喜欢凤凰和长生不老药,所以如果这些看似简单的问题,我很抱歉.在我考虑将其发布到此处之前,我已经搜索了堆栈溢出和博客.

我在模型中有2个字段,字段A:整数和字段B:整数.在使用我的变更集进行验证时,我想创建一个自定义验证,在创建新项目时检查字段A是否超过字段b,如果是,则闪烁错误消息并将它们带回:新路由.对不起,如果我没有使用正确的术语.

所以我想现在这个问题变成了两部分.首先,我是否应该通过创建自定义验证在我的模型中执行此操作,还是应该在控制器中?第二,在凤凰城写这个最简单的方法是什么?

再次感谢.

ecto

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

Elixir ecto 2创建了many_to_many关联

如何与ecto 2建立多对多关系?作为一个示例应用程序,我想创建一个可以在多个类别中的帖子.这些类别已经存在.例如:

[%Category{id: "1", name: "elixir"}, %Category{id: "2", name: "erlang"}]
Run Code Online (Sandbox Code Playgroud)

我正在使用Ecto 2 beta 0.示例项目名为Ecto2.

我定义了两个模型:

defmodule Ecto2.Post do
  use Ecto2.Web, :model
  use Ecto.Schema

  schema "posts" do
    field :title, :string
    many_to_many :categories, Ecto2.Category, join_through: "posts_categories", on_replace: :delete
    timestamps
  end

  @required_fields ~w(title)
  @optional_fields ~w()
  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
    |> cast_assoc(:categories)  # not suitable?
  end
end

defmodule Ecto2.Category do
  use Ecto2.Web, :model

  schema "categories" do
    field :name, :string

    timestamps
  end

  @required_fields ~w(name)
  @optional_fields ~w()
  def changeset(model, …
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

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

如何在凤凰城中将Ecto选择查询转换为结构?

我有两个模型,歌曲和投票,歌曲有很多票.我想选择所有歌曲并计算每张歌曲的票数.

使用mix gen任务生成的SongController中的索引操作已修改为:

def index(conn, _params) do
  query = from s in Song, select: %{id: s.id, name: s.name, artist: s.artist} 
  songs = Repo.all(query)
  render(conn, "index.html", songs: songs)
end
Run Code Online (Sandbox Code Playgroud)

在这种情况下songs包含列表列表.但是在原始的生成函数中,songs = Repo.all(Song)它是一个Song结构列表.

这意味着模板中的song_path函数会出现以下错误消息: maps cannot be converted to_param. A struct was expected, got: %{artist: "Stephen", id: 3, name: "Crossfire"}

当然,我真正想做的是以某种方式num_votes在select语句中添加一个字段,然后以某种方式为Song结构创建一个相应的字段?

elixir ecto phoenix-framework

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

使用Ecto 2.0.0-rc.0并执行ecto.migrate时出现奇怪的错误

今天,我经常尝试在我的Phoenix应用程序中混合使用ecto.migrate,并且出乎意料地发现了以下错误:

warning: could not find repositories for application :adah.

You can avoid this warning by passing the -r flag or by setting the
repositories managed by this application in your config files:

  config :adah, ecto_repos: [...]

The configuration may be an empty list if it does not define any repo.

** (Protocol.UndefinedError) protocol Enumerable not implemented for :ok
(elixir) lib/enum.ex:1: Enumerable.impl_for!/1
(elixir) lib/enum.ex:116: Enumerable.reduce/3
(elixir) lib/enum.ex:1486: Enum.reduce/3
(elixir) lib/enum.ex:609: Enum.each/2
(mix) lib/mix/cli.ex:58: Mix.CLI.run_task/2
Run Code Online (Sandbox Code Playgroud)

我的代表是:

phoenix_ecto: 3.0.0-rc.0
ecto: 2.0.0-rc.0 …
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

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

在Phoenix Application中为异常设置自定义响应

我正在用ecto写凤凰应用程序,并在测试中有以下片段

{:ok, data} = Poison.encode(%{email: "nonexisting@user.com", password: "mypass"})

conn()
|> put_req_header("content-type", "application/json")
|> put_req_header("accept", "application/json")
|> post(session_path(@endpoint, :create), data)
> json_response(:not_found) == %{}
Run Code Online (Sandbox Code Playgroud)

这会抛出一个Ecto.NoResultsError

我有这个定义

defimpl Plug.Exception, for: Ecto.NoResultsError do
  def status(_exception), do: 404
end
Run Code Online (Sandbox Code Playgroud)

但测试仍然抛出Ecto.NoResultsError,任何指针?

elixir ecto phoenix-framework

12
推荐指数
2
解决办法
1779
查看次数

在Ecto变更集中的空原子

为什么在Ecto changeset方法中将params设置为默认:empty原子?例如

def changeset(user, params \\ :empty) do
   ...
Run Code Online (Sandbox Code Playgroud)

这是否允许您使用nil为变量调用changeset方法?

elixir ecto

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

标签 统计

ecto ×10

elixir ×9

phoenix-framework ×6

enums ×1

postgresql ×1