预加载与非默认的belongs_to atom的关联

时间:2016-08-05 16:09:41

标签: elixir ecto

我正在使用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

1 个答案:

答案 0 :(得分:1)

来自has_one/3文档:

  

:foreign_key - 设置外键,它应映射到另一个模式上的字段,默认为后缀为_id的当前模式的下划线名称

由于current_schema为empire_instance,因此密钥为empire_instance_id

也许你的belongs_tohas_one方向错了?或者你在数据库中以错误的方式创建了密钥。

如果没有,您可以发布迁移文件吗?