首页 > 解决方案 > 外部值在数据库中作为空白插入。如何解决这个问题?

问题描述

我正在尝试在其中一列是外键的表中插入数据。我已经创建了表之间的关联,但外键被插入为空白。

我有一个 user_type 的架构

schema “user_type” do
  field(:type, :string)
  has_many(:roles, Accreditor.Role.Roles, foreign_key: :user_type)

  timestamps()
end

def changeset(user_type, attrs) do
  user_type
  |> cast(attrs, [:type])
  |> validate_required([:type])
  |> unique_constraint(:type)
end

并有另一个角色架构

schema “roles” do
  field(:role_name, :string)
  #field(:user_type, :id)
  has_many(:permissions, Accreditor.Permissions.RolePermissions, 
  foreign_key: :role_id)
  belongs_to(:user_type, UserType)

  timestamps()
end

@doc false
def changeset(roles, attrs) do
  roles
  |> cast(attrs, [:role_name])
  |> validate_required([:role_name])
  |> unique_constraint(:role_name)
end

我正在尝试将数据插入角色表,数据角色名称被插入,但外键 user_type 为空白。

请帮我解决这个问题

这些是我的 postgres 表:

select * from user_type;
id | type | inserted_at | updated_at
----±------±--------------------±--------------------
 1 | ADMIN | 2019-05-06 09:19:24 | 2019-05-06 09:19:24

这是我的 user_type 表

select * from roles;
id | role_name | user_type | inserted_at | updated_at
----±----------±----------±--------------------±--------------------
1 | SUPER | | 2019-05-06 09:37:30 | 2019-05-06 09:37:30

这是我的角色表,其中 user_type 字段为空。我不明白我哪里出错了。

标签: postgresqlelixirectophoenix

解决方案


你没有做任何更新user_type,你为什么期望它被更新?用于Ecto.Changeset.cast_assoc/3插入关联,有点像:

def changeset(roles, attrs) do
  roles
  |> cast(attrs, [:role_name])
# ⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓
  |> cast_assoc(:user_type, , with: &UserType.changeset/2)
# ⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑⇑
  |> validate_required([:role_name])
  |> unique_constraint(:role_name)
end

推荐阅读