我在Ecto项目中遇到了这个问题.没有任何查询正在运行.我做了一些谷歌搜索和github问题搜索.有几个但与我的问题无关.
这个问题是从这个问题开始的https://github.com/elixir-lang/ecto/issues/602#issuecomment-145596702(主要与我的问题有关)
query = from u in Univer, where: u.id > 4, select: u
Run Code Online (Sandbox Code Playgroud)
爆发了** (RuntimeError) undefined function: u/0.不仅是那个型号,还有其他型号.我的朋友.
{:postgrex, "~> 0.9.1"},
{:poison, "~> 1.5"},
{:httpoison, "~> 0.7.2"},
{:ecto, "~> 1.0.4"},
{:floki, "~> 0.5"}
Run Code Online (Sandbox Code Playgroud)
目前所有从db读取都是通过psql.它做的工作,但很烦人.:)
供参考.
defmodule Univer do
use Ecto.Model
import Ecto.Query
schema "univers" do
field :ref, :integer
field :name, :string
field :legal_name, :string
field :city, :string
field :type, :string
field :address, :string
field :contacts, {:array, :string}
field :fax, :string
field :phones, {:array, …Run Code Online (Sandbox Code Playgroud) ERROR 22001(string_data_right_truncation):类型字符变化的值太长(255)
我理解(并假设)字符串将限制为一定数量的字符; 但是,我不确定哪种类型最适合这种情况.
我应该使用什么类型的凤凰框架博客的"内容"部分?
数据将是文本段落,不能限制大小.
提前致谢.
有没有办法预先加载ecto关联而不显式使用preload:?
类似于架构中的选项?
schema "gadgets" do
field :foo,
has_many :bars, Myapp.Bar, preload: true
end
Run Code Online (Sandbox Code Playgroud)
我正在做类似的事情
Repo.get(Gadget, id)
|> Repo.preload: [:bars]
Run Code Online (Sandbox Code Playgroud)
编辑:我试图这样做的原因是因为我想将相关模型预加载到已经预加载的相关模型,如
preload: [:invoices preload: :items]
Run Code Online (Sandbox Code Playgroud) 我开始玩Ecto试图理解它.正如预期的那样,我搞砸了(使用用户模型),我在运行迁移时遇到错误:
(Postgrex.Error) ERROR (duplicate_table): relation "users" already exists
Run Code Online (Sandbox Code Playgroud)
现在,我想使用shell/PgAdmin III清理数据库,以便我可以修复我的模型并再次运行迁移.我已经设置了PgAdmin,但我无法看到任何"用户"表...这样做的最佳方式是什么(使用Ecto,PostgreSQL shell还是PgAdmin)?
我试图找出一种方法来检查凤凰应用程序(使用Elixir)中的params散列是否具有特定的密钥.
在模型中的以下变更集功能中,参数默认为:空.
def changeset(model, params \\ :empty) do
Run Code Online (Sandbox Code Playgroud)
我需要弄清楚哈希中是否存在名为:username的密钥.
我有一个Ecto模型:
defmodule Project.Category do
use Project.Web, :model
schema "categories" do
field :name, :string
field :list_order, :integer
field :parent_id, :integer
belongs_to :menu, Project.Menu
has_many :subcategories, Project.Category, foreign_key: :parent_id
timestamps
end
@required_fields ~w(name list_order)
@optional_fields ~w(menu_id parent_id)
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
end
end
Run Code Online (Sandbox Code Playgroud)
如您所见,Category模型可以通过子类别atom引用自身.
以下是与此模型关联的视图:
defmodule Project.CategoryView do
use Project.Web, :view
def render("show.json", %{category: category}) do
json = %{
id: category.id,
name: category.name,
list_order: category.list_order
parent_id: category.parent_id
}
if is_list(category.subcategories) do
children = render_many(category.subcategories, Project.CategoryView, …Run Code Online (Sandbox Code Playgroud) 我正在凤凰城编写一个简单的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)
这就是我想要设置关联的方式: …
我正在处理我的应用程序的统计页面,并尝试按日期查询数据.
为了获得日期范围,我使用 Calendar.Date
date_range = Date.days_after_until(start_date, end_date, true)
|> Enum.to_list
Run Code Online (Sandbox Code Playgroud)
它返回日期的日期列表,每个日期看起来像"2017-04-07".因此,根据我的日期date_range,我尝试查询,但它会触发如下错误.
where cannot be cast to type Ecto.DateTime in query: from o in Myapp.Order,
where: o.created_date >= ^~D[2017-04-07]
对于created_date秩序领域,我做了这样的领域,
field :created_date, Ecto.DateTime.
如果我想按日期查询,我该如何查询?
预先感谢.