使用旧数据库的 Ecto 中的 bigint 与整数错误

bigint versus integer error in Ecto with Legacy database

我处于以下情况:有一个来自 Rails 应用程序的 PostgreSQL 遗留数据库,我需要与之交互。

Phoenix 正在使用带有模式的 Repo 连接到该数据库,到目前为止它似乎工作正常,我可以检索元素并执行一些具有预期结果的基本查询。

现在,我开始尝试一些高级查询,但遇到了一些我不知道如何解决的问题。例如:

from(is in acc, or_where: ^current_user.id in [is.transcriber_id, is.radiologist_id, is.validator_id])

returns下面的错误

** (Postgrex.Error) ERROR 42P08 (ambiguous_parameter): inconsistent types deduced for parameter 

bigint versus integer
    (ecto) lib/ecto/adapters/sql.ex:431: Ecto.Adapters.SQL.execute_and_cache/7
    (ecto) lib/ecto/repo/queryable.ex:133: Ecto.Repo.Queryable.execute/5
    (ecto) lib/ecto/repo/queryable.ex:37: Ecto.Repo.Queryable.all/4

经过一些研究,我发现 Rails 中的 ActiveRecord 将整数存储为 bigints 但我不确定 Postgrex 或 Ecto(我真的不知道谁负责这个)正在正确解释我在查询中使用的整数 current_user.id

我感觉 in [is.transcriber_id, is.radiologist_id, is.validator_id] 这个表达式有点贪心,也许我应该使用片段。

更新:

is 代表 ImagingStudy。 Rails本模型迁移如下:

class CreateImagingStudies < ActiveRecord::Migration[5.2]
  def change
    create_table :imaging_studies do |t|
      t.string :status_name
      t.bigint :validator_id
      t.bigint :radiologist_id
      t.bigint :transcriber_id

      t.timestamps
    end
  end
end

操作table对应imaging_studies的Phoenix schema如下

defmodule Worklist.Studies.ImagingStudy do
  use Ecto.Schema

  schema "imaging_studies" do
    field :transcriber_id, :integer
    field :radiologist_id, :integer
    field :validator_id, :integer

    timestamps(inserted_at: :created_at, updated_at: :updated_at)
  end

没有用户架构,因为他们是在另一项服务中管理的。考虑 current_user 具有名为 id.

的整数字段的映射

Ecto 自愿 explicitly maps :integer 输入到 Postgres 的 :bigint.

也就是说,通过使用具有适当类型映射的 Ecto.Query.API.type/2 one might explicitly cast the parameter to :bigint to help

from(
  is in acc,
  or_where:
    type(^current_user.id, :integer) in [
      is.transcriber_id, is.radiologist_id, is.validator_id
    ]
)