【发布时间】:2017-04-20 02:25:38
【问题描述】:
我试图找出在哪里放置我通常会(在 Rails/ActiveRecord 中)放在模型类中的常用函数。具体来说,我有User 和Company,它们之间存在多对多关系,但用户有一个default_company,它在user_companies 连接表上只有一个布尔标志。
活动记录
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
我可以在 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 查询放在控制器中或以其他方式将 Ecto 查询散布到您的应用程序中,这似乎也是错误的。
【问题讨论】: