gpt4 book ai didi

phoenix-framework - Phoenix/Ecto 中的瘦 Controller /厚模型

转载 作者:行者123 更新时间:2023-12-04 07:44:00 24 4
gpt4 key购买 nike

我试图弄清楚将通常(在 Rails/ActiveRecord 中)放在模型类中的常用函数放在哪里。具体来说,我有 UserCompany,它们之间存在多对多关系,但用户有一个 default_company,它只有一个user_companies 连接表上的 bool 标志。

事件记录

class User < ActiveRecord::Base
belongs_to :user_companies
has_many :companies, through: :user_companies

def default_company
# Filter through companies to find the one that I want
end
end

(请注意,可能还有更简单的方法,但这是基本思想。)

外链

我可以在 Ecto 中做类似的事情,像这样:

defmodule MyApp.User do
use MyApp.Web, :model

alias MyApp.{Company, CompaniesUser}

schema "users" do
has_many :companies_users, CompaniesUser, on_delete: :delete_all
many_to_many :companies, Company, join_through: "companies_users"
end

def default_company(%User{} = user) do
from(company in Company,
join: cu in CompaniesUser,
where: cu.company_id == company.id
and cu.user_id == ^user.id
and cu.default_company == true
) |> first() |> Repo.one()
end
end

但是,根据我有限的经验,这似乎是不正确的。我看到的所有示例都使 Ecto 模型非常有限,只有一堆 changeset 方法和一些验证代码,但严格来说与业务无关。有人谈论将您的业务逻辑与数据库逻辑分开。我理解并尊重它,但大多数示例都显示将原始 Ecto 查询放入 Controller 或以其他方式在您的应用程序中散布 Ecto 查询,这似乎也是错误的。

最佳答案

Phoenix 1.3

从我读到的 the upcoming 1.3 , 看起来期望这将通过 Contexts 处理,或者具体地说,允许您逻辑分组 Ecto 模式模型的模块以及定义(手动: 定义它)访问持久层的 API。所以,使用我上面的例子,它会是这样的:

defmodule MyApp.Account do

alias MyApp.Account.User
alias MyApp.Corporate.{Company, CompaniesUser}

def default_company(%User{} = user) do
from(company in Company,
join: cu in CompaniesUser,
where: cu.company_id == company.id
and cu.user_id == ^user.id
and cu.default_company == true
) |> first() |> Repo.one()
end
end

defmodule MyApp.Account.User do
use MyApp.Web, :model

alias MyApp.Corporate.{Company, CompaniesUser}

schema "users" do
has_many :companies_users, CompaniesUser, on_delete: :delete_all
many_to_many :companies, Company, join_through: "companies_users"
end
end

它有 2 个模块,一个 (MyApp.Account.User) 是我的原始 Ecto 模式。另一个 (MyApp.Account) 是我应用中所有其他逻辑的 API/入口点,例如 Controller 。

我想我喜欢这个理论,但我担心试图弄清楚哪些模型应该放在哪里,就像这个例子:Does Company belong in the Account 上下文,还是创建一个新的 Corporate 上下文?

(很抱歉问/回答我自己的问题,但在研究这个问题时我找到了 Phoenix 1.3 的信息,我想我也可以发帖给任何感兴趣的人。)

关于phoenix-framework - Phoenix/Ecto 中的瘦 Controller /厚模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43503416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com