【发布时间】:2016-02-13 18:06:08
【问题描述】:
我正在使用 Phoenix 框架构建一个小测试应用程序。我不能使用 Ecto,因为我的数据库不受支持。但我仍然想要 MVC 模式。所以我需要一种方法来实现自定义模型。因为我来自 RoR,所以我总是发现自己在思考面向对象的编程模式,在这种模式中你有一个类定义和实例,这些实例具有你可以获取和设置的属性。所以这样的事情是可能的:
@mike = User.new
@mike.name = "Mike Power"
@mike.save
# ect
但这显然不是 Elixir 的工作原理。
我很难思考如何解决这个问题。实施应该允许我:
- 有属性
- 存储值
- 处理值
- 验证值
- 将它们保存到我的数据库中
到目前为止,我想出的最好方法是使用结构。所以是这样的:
defmodule User do
defstruct name: "", age: 0
def sayhello do
IO.puts "Hi, I am #{name}"
# This is not working, I just put it here to make a point
end
end
tim = %User{}
# -> %User{age: 0, name: ""}
tim = %User{name: "Tim Turbo", age: 25}
# -> %User{age: 25, name: "Tim Turbo"}
tim.name
# -> "Tim Turbo"
# We can also change the values
tim = %User{name: "Michael"}
# -> %User{age: 25, name: "Michael"}
# It also makes sure that only the values defined in the struct can be set (which is nice)
tom = %User{unknown: "something"}
# ** (CompileError) iex:11: unknown key :unknown for struct User
使用vex 我什至可以很容易地实现验证
defmodule User do
defstruct username: nil, password: nil, password_confirmation: nil
use Vex.Struct
validates :username, presence: true,
length: [min: 4],
format: ~r/^[[:alpha:]][[:alnum:]]+$/
validates :password, length: [min: 4],
confirmation: true
end
所以我基本上是在问:
- 这是要走的路吗?还是有更好的?
- 我是否会在我的用户模块中实现将用户实际保存到数据库的功能?我只是输入参数的地方
类似这样的:
user = %User{params}
User.create user
【问题讨论】:
-
阅读
ecto的源代码是一个很好的起点:github.com/elixir-lang/ecto