gpt4 book ai didi

elixir - 通过 : in Elixir Ecto 以编程方式预加载 has_many

转载 作者:行者123 更新时间:2023-12-04 01:56:25 26 4
gpt4 key购买 nike

我正在尝试以编程方式将预加载附加到我的一个具有 has_many, through: 的模型的查询中。关系。

我的模块:

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

schema "chemicals" do
has_many :company_chemicals, MyApp.CompanyChemical
has_many :companies, through: [:company_chemicals, :companies]

field :name, :string
end

def with_companies(query) do
from chem in query,
left_join: comp_chem in assoc(chem, :company_chemicals),
join: company in assoc(comp_chem, :company),
preload: [companies: company]
end

end

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

schema "companies" do
has_many :company_chemicals, MyApp.CompanyChemical
has_many :chemicals, through: [:company_chemicals, :chemicals]

field :name, :string
end
end

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

schema "company_chemicals" do
belongs_to :chemical, MyApp.Chemical
belongs_to :company, MyApp.Company
end
end

使用这些型号, MyApp.Chemical.with_companies/1按预期工作,返回一个查询,该查询将生成一个带有填充 :companies 的化学品字段,但我试图通过关联表以编程方式预加载字段,如下所示:
def preload_association(query, local_assoc, assoc_table, assoc_table_assoc) do
from orig in query,
left_join: association_table in assoc(orig, ^assoc_table),
join: distal in assoc(association_table, ^assoc_table_assoc),
preload: [{^local_assoc, distal}]
end

但是,由于 preload: [{^local_assoc, distal}],此函数将无法编译。线。

如何预加载一个 has_many 的 assoc?谢谢。

最佳答案

您是否以任何方式过滤您的联接?因为,如果你不是,你应该调用 preload 来代替:

query = from c in MyApp.Company, where: ...
companies = Repo.all(query)
companies_with_chemicals = Repo.preload(companies, :chemicals)

或者:
query = from c in MyApp.Company, preload: :chemicals
companies_with_chemicals = Repo.all(query)

它也会更快,因为它会执行两个单独的查询,从而减少要从 companies_size * chemicals_size 处理的整体结果集大小。至 companies_size + chemicals_size .

请注意,您还应该能够加入 has_many :through .

关于elixir - 通过 : in Elixir Ecto 以编程方式预加载 has_many,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31308969/

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