Elixir 预加载尝试获取错误的列名
我有以下对象Elixir 预加载尝试获取错误的列名,elixir,ecto,Elixir,Ecto,我有以下对象 defmodule Ketchup.Review do ... schema "order_review" do ... has_many :review_tags, Review.Tag end end 及 并使用以下查询 @preload [:review_tags, :order] def get_review_by_order(order_id) do Ketchup.Review |> where([c], c.order
defmodule Ketchup.Review do
...
schema "order_review" do
...
has_many :review_tags, Review.Tag
end
end
及
并使用以下查询
@preload [:review_tags, :order]
def get_review_by_order(order_id) do
Ketchup.Review
|> where([c], c.order_id == ^order_id)
|> preload(^@preload)
|> Repo.one()
end
请给出以下错误:
** (Ecto.QueryError) deps/ecto/lib/ecto/association.ex:495: field `Ketchup.Review.Tag.review_id` in `where` does not exist in the schema in query:
from t in Ketchup.Review.Tag,
where: t.review_id == ^2,
order_by: [asc: t.review_id],
select: {t.review_id, t}
这篇评论id
从哪里来?我已经检查了所有的代码,查看了atom或关联,但是没有找到任何东西。它应该是order\u review\u id
通过以下迁移创建审阅标记:
create table(:review_tag) do
add :review_tag, :string
add :order_review_id, references(:order_review, on_delete: :delete_all)
end
由于您的模块名称以
review
结尾,因此Exto正在尝试使用键review\u id
。如果您想使用其他按键,则必须在通话中指定:foreign\u key
选项
请注意,我是根据您指定的
所属/3
猜测密钥名称的。正确的代码是:has\u many:review\u tags,Ketchup.review.Tag,foreign\u key::order\u review\u id,但仍然不应该查看架构名称,在这种情况下,order\u review
add添加\u id
之后?我已经将Ketchup.review更改为Ketchup.order.review,这更符合上下文,但是如果我有Ketchup.Food.review,我需要不断更改外键以指向正确的方向,这有点混乱。这两种方法都可以起作用。如果它像您建议的那样对模式名称起作用,我可以看到人们在这里提出相反的问题。:)我认为保持现状的一个优点是它依赖于长生不老药代码约定,而不是数据库约定,因为数据库约定可能会有很大的差异。
create table(:review_tag) do
add :review_tag, :string
add :order_review_id, references(:order_review, on_delete: :delete_all)
end
has_many :review_tags, Ketchup.Review, foreign_key: :order_review_id