我正在凤凰城编写一个简单的CRUD应用程序,管理员在创建新组织时可以使用初始员工帐户进行配置.
有效地,组织和用户之间的关系是多对多的.
我想出了以下内容:
用户架构:
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)组织架构:
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)使用PostgreSQL,我们可以这样做:
CREATE TYPE order_status AS ENUM ('placed','shipping','delivered')
Run Code Online (Sandbox Code Playgroud)
从Ecto的官方文档来看,没有本地类型可以映射Postgres的枚举类型.此模块为枚举结构提供自定义类型,但它映射到数据库中的整数.我可以轻松地使用该库,但我更喜欢使用数据库附带的本机枚举类型.
Ecto还提供了一种创建自定义类型的方法,但据我所知,自定义类型必须映射到本机Ecto类型...
任何人都知道这是否可以在Ecto的架构中完成?如果是,迁移将如何运作?
我有点陷入如何实际设置与变更集的关联.我在我的模型中有这个代码:
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)
这就是我想要设置关联的方式: …
我有一个帖子和评论模型.一篇帖子有很多评论,一篇评论属于帖子.
在显示个人评论时,如何访问其所属的帖子?
即在Ruby on Rails中你可以做到:
@comment = Comment.find(params[:id])
@post = @comment.post
Run Code Online (Sandbox Code Playgroud)
我怎样才能使用Phoenix Elixir框架实现这一目标?我相信我已正确设置了模型关联,但我对如何在视图或控制器中实际获取此查询感到困惑.
我真的很喜欢凤凰和长生不老药,所以如果这些看似简单的问题,我很抱歉.在我考虑将其发布到此处之前,我已经搜索了堆栈溢出和博客.
我在模型中有2个字段,字段A:整数和字段B:整数.在使用我的变更集进行验证时,我想创建一个自定义验证,在创建新项目时检查字段A是否超过字段b,如果是,则闪烁错误消息并将它们带回:新路由.对不起,如果我没有使用正确的术语.
所以我想现在这个问题变成了两部分.首先,我是否应该通过创建自定义验证在我的模型中执行此操作,还是应该在控制器中?第二,在凤凰城写这个最简单的方法是什么?
再次感谢.
如何与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) 我有两个模型,歌曲和投票,歌曲有很多票.我想选择所有歌曲并计算每张歌曲的票数.
使用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结构创建一个相应的字段?
今天,我经常尝试在我的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) 我正在用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,任何指针?
为什么在Ecto changeset方法中将params设置为默认:empty原子?例如
def changeset(user, params \\ :empty) do
...
Run Code Online (Sandbox Code Playgroud)
这是否允许您使用nil为变量调用changeset方法?