Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 是否有可能在EXTO的多个关联中添加额外的字段?_Postgresql_Phoenix Framework_Ecto - Fatal编程技术网

Postgresql 是否有可能在EXTO的多个关联中添加额外的字段?

Postgresql 是否有可能在EXTO的多个关联中添加额外的字段?,postgresql,phoenix-framework,ecto,Postgresql,Phoenix Framework,Ecto,我是外星人的新手。我在Ecto模式中定义了三个表,分别是User、Role和UserRole。在UserRole中,我需要更新与用户和角色表关联的附加字段(如“状态”),这将在UserRole表中创建一个条目 // User Schema schema "users" do field :first_name, :string field :last_name, :string field :email, :string many_to_many :roles,

我是外星人的新手。我在Ecto模式中定义了三个表,分别是User、Role和UserRole。在UserRole中,我需要更新与用户和角色表关联的附加字段(如“状态”),这将在UserRole表中创建一个条目

// User Schema
schema "users" do
    field :first_name, :string
    field :last_name, :string
    field :email, :string

    many_to_many :roles, Role, join_through: "userroles"
end

// Role Schema
schema "roles" do
    field :code, :string
    field :description, :string

    many_to_many :users, User, join_through: "userroles"
end

// UserRole Schema
schema "userroles" do
    field :is_default, :boolean, default: false
    field :status, :string
    field :user_id, :id
    field :role_id, :id

    belongs_to :users, User, define_field: false
    belongs_to :roles, Role, define_field: false
end
//以下是我所做的步骤

  • 使用iex-S mix打开iex
  • 在用户表中插入了一条记录

    auserChangeset=User.changeset(%User{},%%电子邮件:xyz@gmail.com,名字:“xyz”,姓氏:“z”}) buser1=Repo.insert!(userChangeset)

  • 在角色表中插入了记录

    // User Schema
    schema "users" do
        field :first_name, :string
        field :last_name, :string
        field :email, :string
    
        many_to_many :roles, Role, join_through: "userroles"
    end
    
    // Role Schema
    schema "roles" do
        field :code, :string
        field :description, :string
    
        many_to_many :users, User, join_through: "userroles"
    end
    
    // UserRole Schema
    schema "userroles" do
        field :is_default, :boolean, default: false
        field :status, :string
        field :user_id, :id
        field :role_id, :id
    
        belongs_to :users, User, define_field: false
        belongs_to :roles, Role, define_field: false
    end
    
    aroleChangeset=Role.changeset(%Role{},%%代码:“CON”,说明:“消费者”}) brole1=Repo.insert!(roleChangeset)

  • 现在一切正常,我分别在变量user1和变量role1中有用户记录和角色记录
  • 现在我需要关联这两条记录,以便在UserRole表中插入一条记录。在关联user1和role1记录时将自动创建
  • 通过在iex处使用以下命令关联user1和role1记录

    auserRoleAssoc=user1 |>Repo.preload(:roles)|>exto.Changeset.change()|>exto.Changeset.put_assoc(:roles,[role1])|>Repo.update

  • 是的,它在UserRole处插入一条记录,如下所示

  • 但这里的问题是,我需要在关联时将status字段插入到。我该怎么做呢
  • 我试图更新UserRole记录

    afetchUserRole=Repo.get_by(UserRole,id:1)

    bfetchUserRole=%{fetchUserRole |状态:“活动”}

    cfetchUserRole>exto.Changeset.change()|>Repo.update

  • 结果如下。结果它得到了更新,但没有反映在我的数据库中。结果保持如上图所示

    {好的, %用户角色{ meta:#exto.Schema.Metadata, 公司:#异位协会。未加载, id:1, 默认值为:false, 角色编号:1, 角色:#exto.Association.NotLoaded, 状态:“活动”, 用户id:1, 用户:#exto.Association.NotLoaded }}

  • 我的问题是,如果是多对多关联,有没有办法在关联时插入字段值。如果是的意思是,怎么做

  • 要真正回答#11,有一个关于您的业务逻辑的问题需要回答:

    用户将用户分配给角色时,是否正在创建新角色?或者只是从预定义的角色中进行选择

    我想是后者。如果是这样的话,我想你可以做以下事情

    defmodule YourApp.User do
      use Ecto.Schema
      import Ecto.Changeset
    
      schema "users" do
        ...
        has_many :user_roles, YourApp.UserRole
      end
    
      def changeset(user, params) do
        user
        |> cast_things...
        |> cast_assoc(:user_roles)
      end
    end
    
    …因为您的用户从不更改可用的角色。只是用户角色。这会让你做一些像

    user=YourApp.Repo.get(YourApp.user,1)


    这是可能的。然而,我个人发现使用
    cast_assoc
    有时很难理解,尤其是在给定的情况下,因此我倾向于直接处理连接表。这就是为什么我在上面的评论中提到,我对上面的第9步和第10步不起作用感到困惑。

    我对上面的第9步和第10步感到困惑。看起来你在#9中没有做任何改变?您是如何在#10中获得
    状态:“活动的”
    ?如果你在#10中得到了一些东西,它应该反映在数据库中
    Repo.get_by
    应将相同的值返回到先前的
    Repo.update
    。不知道如何帮助…@Lanny Bose,我错过了在上午9点之间发布步骤。和#9 b。首先很抱歉。我会更新我的问题我已经更新了我的问题。我不知道为什么在执行了#9a、#9b和#9c中的步骤后,它没有反映在db中。我做错什么了吗。如果我错了,请纠正我。啊。。。问题是,你误用了上面的
    change/2
    :看看上面文档中的例子。上面的B行不会产生任何更改。相反,对于#11,您需要
    exto.Changeset.change(fetchUserRole,%{status:“Active”})
    。是的,他们打算为9和10使用预定义的角色,我试着像我提到的那样,但它在iex中显示了结果,但在db中没有反映出来。现在我为用户和角色表使用了has_many:user_roles,YourApp.UserRole。我可以通过执行以下操作来更新它。A.user_role=Repo.get_by(UserRole,id:1),b。用户|角色|>UserRole.changeset(%%{status:“Active”})|>Repo.update()