我正在使用Ecto 2.0并尝试运行此查询:
query = from e in EmpireInstance,
where: e.user_id == ^user.id,
preload: [:board]
董事会的架构如下所示:
schema "board_instances" do
belongs_to :empire, PlexServer.EmpireInstance
has_many :board_pieces, BoardTileInstance
timestamps
end
EmpireInstance架构:
schema "empire_instances" do
...
belongs_to :user, PlexServer.User
has_one :board, PlexServer.BoardInstance
...
timestamps
end
我收到此错误:
**(Ecto.QueryError)deps / ecto / lib / ecto / association.ex:392:
PlexServer.BoardInstance.empire_instance_id
中的字段where
在查询中的架构中不存在:from b in PlexServer.BoardInstance, where: b.empire_instance_id in ^[1], select: {b.empire_instance_id, b}
看起来它仍在尝试使用module_name + _id的默认belongs_to id。有没有办法解决这个问题,除了将belongs_to atom更改回默认值?
以下是进行查询的代码:
def show(conn, _) do
user = Guardian.Plug.current_resource(conn)
query = from e in EmpireInstance,
where: e.user_id == ^user.id,
preload: [:board]
case Repo.one(query) do
nil ->
conn
|> put_status(:unprocessable_entity)
|> json(%{errors: ["No associated empire"]})
empire ->
render(conn, PlexServer.EmpireInstanceView, "show.json", empire: empire)
end
end
答案 0 :(得分:1)
来自has_one/3文档:
:foreign_key - 设置外键,它应映射到另一个模式上的字段,默认为后缀为_id的当前模式的下划线名称
由于current_schema为empire_instance
,因此密钥为empire_instance_id
也许你的belongs_to
和has_one
方向错了?或者你在数据库中以错误的方式创建了密钥。
如果没有,您可以发布迁移文件吗?