外部值在数据库中插入为空白。如何解决呢?

时间:2019-05-07 05:51:19

标签: postgresql elixir ecto phoenix

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

我有一个用于user_type的架构

buildscript {
    ext.kotlin_version = '1.3.0'
    repositories {
        google()
        jcenter()


    }

    dependencies {
        classpath 'com.android.tools.build:gradle:5.1.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.google.gms:google-services:3.4.0'
    }
}

allprojects {
    configurations.all {
        resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            def requested = details.requested
            if (requested.group == 'com.google.firebase') {
                details.useVersion "15.+"
            }
            
        }
    }
    repositories {
        google()
        jcenter()

    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

并具有另一个角色架构

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

并且我正在尝试将数据插入到角色表中,插入了数据role_name,但是外键user_type为空。

请帮助我

这些是我的postgres表:

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表

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字段为空。我不知道我哪里出了错。

1 个答案:

答案 0 :(得分:0)

您不执行任何操作来更新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