Elixir / Phoenix Ecto预加载协会不适用于has_many

时间:2017-10-11 14:42:34

标签: associations elixir phoenix-framework ecto preload

我疯了。现在工作半天我的问题,无法找到解决方案/错误。创建聊天时,我得到了一个聊天模型和一个将用户模型作为外键的chat_user模型。

聊天有has_many :chat_users, Test.Chat.ChatUser, foreign_key: :chat_id个,而且chat_user有belongs_to :user, Test.Userbelongs_to :chat, Test.Chat.Chat

我正在预先加载协会:

  defp preload_associations(chat, params \\ nil) do
    Repo.preload(chat, [
     :chat_users
   ])
  end

我得到的错误是:** (Postgrex.Error) ERROR 42703 (undefined_column): column c0.user_id does not exist

数据库中的表chat_users具有带外键的字段user_id。在我看来,Ecto正在聊天而不是user_id中搜索chat_user

知道我做错了什么吗?感谢。

编辑:模特

defmodule Test.Chat.ChatItem do
@moduledoc false

use Test.Web, :model

schema "chats" do
  field :name, :string
  ...
  has_many :chat_users, Test.Chat.ChatUser, foreign_key: :chat_id
  timestamps()
end


defmodule Test.Chat.ChatUser do
use Test.Web, :model

schema "chat_users" do
  ...
  belongs_to :user, Test.User
  belongs_to :chat, Test.Chat.Chat
end

defmodule Test.User do
...

1 个答案:

答案 0 :(得分:0)

最后我发现了错误。与我的迁移或模型无关。问题是由某些环境配置引起的。构建开发和测试数据库的脚本没有删除测试数据库,因此它在chat_users表中没有user_id。在docker容器内进行混合测试时发生错误,因此发现错误并不容易。我是elixir的新手,仍然讨厌堆栈跟踪,用于读取一些不错的c#stacktrace;) 但感谢你的帮助。