【问题标题】:Data manipulation inside a Phoenix modelPhoenix 模型中的数据操作
【发布时间】:2016-04-30 23:31:47
【问题描述】:

(来自 Rails 世界,我现在正在和 Phoenix 一起玩,试图弄清楚事情是如何运作的)

从脚手架开始,我有一个包含“first_name”和“last_name”属性的用户模型,我现在想做的是在模型中将它们连接到“full_name”属性,并对其进行测试。

好的,比较 Rails 和 Phoenix 可能不是最好的做法,但让我展示一下我如何使用 Rails 来做这件事,这样我的问题就可以完全理解:

# Model
class User < ActiveRecord::Base
  def full_name
    "#{first_name} #{last_name}"
  end
end

# Test
it "concatenates first_name and last_name" do
  user = users(:jhondoe)
  assert_equal "jhon doe", user.full_name
end

我如何使用 Phoenix 实现同样的目标,甚至是“实现它的方法”,因为经过数小时的密集谷歌搜索后我找不到任何相关内容?

我在哪里以及如何使用 Phoenix 处理数据操作?

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    由于 Elixir 中没有方法,因此推荐的方法是为此在 User 模块中创建一个函数,并在需要 User 的全名时显式调用它。

    defmodule YourApp.User do
      ...
    
      def full_name(%YourApp.User{first_name: first_name, last_name: last_name}) do
        "#{first_name} #{last_name}"
      end
    end
    

    然后,在您的测试、模板和/或视图中,像这样调用它:

    YourApp.User.full_name(user)
    

    旁注:在 Ecto 1.x 中,可以创建一个虚拟字段并添加 after_load 回调以在每次加载模型时设置其值,但在 Ecto 2.0 中将删除回调(应该很快就会发布) ) 所以创建一个函数是要走的路。

    【讨论】:

      【解决方案2】:

      连接名字和姓氏不能是模型的责任。您需要设计您的应用并创建可以执行此类操作的特殊模块、某种装饰器或任何适合函数式编程的名称。

      但是关于代码,Dogbert 的回答很棒。

      【讨论】:

      • 看来你是对的...我是FP/Elixir/Phoenix的新手,玩的越多,“模型”似乎只是一种DB 连接器,在外部模块中处理数据操作。我这样想对吗?
      • @gbarillot 我不确定,我认为它与函数式语言或其他无关,这只是常识,每个模块的责任越少,您的项目就越受支持是。如果你把所有东西都放在你的模型中,你很快就会得到 50 个变更集、100 个修饰姓氏的函数和 200 个以不同方式更新不同属性的函数。实际上,RoR 也是如此。
      猜你喜欢
      • 2017-05-15
      • 1970-01-01
      • 2018-04-01
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 2020-03-29
      • 2016-11-27
      相关资源
      最近更新 更多