【发布时间】:2018-06-28 14:00:41
【问题描述】:
我遇到了这种情况,我使用一些自定义 sql 生成了一个中间表。在我的应用程序中,我有一个指向该中间表的模型。我有这个不使用中间表的要求,所以我试图弄清楚如何编写一个 Ecto 模型,以便它使用该自定义 sql 为该模型加载数据。
重要提示:此模型仅用于读取该表或 sql 选择结果,因此我不必支持插入/更新/删除。这应该会大大简化我正在尝试做的事情。
这是我想做的假模型:
defmodule EventBridge.C3poEvent do
use Ecto.Schema
import Ecto
import Ecto.Query, only: [from: 1, from: 2]
schema intermediate_table_name do
field :id, :integer
field :access_dates, :string
field :action, :string
field :counter, :integer
end
end
让我们假设这个 sql 来获取数据:
select id, access_dates, action, counter from some_other_table
where some_conditions = true;
我需要做的是使用该 sql 加载模型,而不是从我的示例所支持的表中加载模型。
在我的脑海中,我在想我应该在模型中添加一个函数,例如:
def get_model(Model, some_conditions) do
...
end
在该函数中,只需手动加载带有 sql 的模型。但我不相信这 a) 有意义或 b) 会产生一个我可以用来访问字段的模型。
也许我什至不应该使用模型?只是一个包含 get_model 方法的自定义结构,而不用担心用架构支持它?
再次,请不要说我只是在阅读这些数据。
【问题讨论】:
-
Ecto.Schema是完美的生活,没有任何真正的桌子;我经常使用Ecto.Schema来方便地验证结构。除此之外,我不确定我是否了解问题所在。您是否需要它完全符合Ecto以便您可以在复杂的查询中使用它? -
不,我只需要能够加载一组行并像访问任何结构一样访问它们。 (例如
mystruct.id)我想知道我是否只是创建了一个与 ecto 模型/模式机制无关的结构,并有一个执行 sql 并将其映射到结构中的方法 -
另外,如果您不使用真实表支持模型架构的代码,它会是什么样子?
-
如果你想要一个不受表支持的架构hexdocs.pm/ecto/Ecto.Schema.html#embedded_schema/1,你可以使用
embedded_schema