Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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
Ruby on rails 当两个关联模型均未创建时,如何处理创建联接模型的操作?_Ruby On Rails_Ruby_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails 当两个关联模型均未创建时,如何处理创建联接模型的操作?

Ruby on rails 当两个关联模型均未创建时,如何处理创建联接模型的操作?,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,在一个简化的设置中,我有4个模型 应用程序:有许多环境、变量 环境:有许多可变值 变量:有许多变量值 VariableValue:属于环境,变量 在我的react应用程序中,您创建一个应用程序,然后您可以独立创建环境和变量。每个变量对于每个环境都可以有一个值,因此我创建了一个具有实际值的VariableValue,然后创建了一个环境id和变量id,将变量值与环境相关联。当保存此文件时,它会一次保存所有文件,我没有一个环境id给联接模型,因为在创建VariableValue之前,变量或环境都不

在一个简化的设置中,我有4个模型

  • 应用程序:有许多环境、变量
  • 环境:有许多可变值
  • 变量:有许多变量值
  • VariableValue:属于环境,变量
在我的react应用程序中,您创建一个应用程序,然后您可以独立创建环境和变量。每个变量对于每个环境都可以有一个值,因此我创建了一个具有实际值的VariableValue,然后创建了一个环境id和变量id,将变量值与环境相关联。当保存此文件时,它会一次保存所有文件,我没有一个环境id给联接模型,因为在创建VariableValue之前,变量或环境都不会被持久化。我正在用accepts _嵌套的属性保存整个应用程序。这可能是不可能的,所以我很好奇其他人是如何处理这种情况的

谢谢

更新:

这是我的模型

class Workspace < ApplicationRecord
  has_many :workspace_envs, inverse_of: :workspace
  has_many :workspace_variables, inverse_of: :workspace
  accepts_nested_attributes_for :workspace_envs, :workspace_variables, allow_destroy: true
end

class WorkspaceEnv < ApplicationRecord
  acts_as_paranoid
  belongs_to :workspace, inverse_of: :workspace_envs

  has_many :workspace_env_variable_values, inverse_of: :workspace_env
  has_many :workspace_variable_values, inverse_of: :workspace_env, through: :workspace_env_variable_values
  has_many :workspace_variables, inverse_of: :workspace_envs, through: :workspace_env_variable_values


end

class WorkspaceVariable < ApplicationRecord
  belongs_to :workspace, inverse_of: :workspace_variables
  has_many :workspace_env_variable_values, inverse_of: :workspace_variable
  has_many :workspace_variable_values, inverse_of: :workspace_variable, through: :workspace_env_variable_values, dependent: :destroy
  has_many :workspace_envs, inverse_of: :workspace_variables, through: :workspace_env_variable_values

  accepts_nested_attributes_for :workspace_variable_values, allow_destroy: true

end

class WorkspaceVariableValue < ApplicationRecord
  include VariableValue

  has_one :workspace_env_variable_value, inverse_of: :workspace_variable_value
  has_one :workspace_variable, inverse_of: :workspace_variable_values, through: :workspace_env_variable_value
  has_one :workspace_env, inverse_of: :workspace_variable_values, through: :workspace_env_variable_value

  accepts_nested_attributes_for :workspace_env

end


class WorkspaceEnvVariableValue < ApplicationRecord
  belongs_to :workspace_env, inverse_of: :workspace_env_variable_values
  belongs_to :workspace_variable_value, inverse_of: :workspace_env_variable_value
  belongs_to :workspace_variable, inverse_of: :workspace_env_variable_values
end
类工作区

这里重要的是,所有这些模型都是同时创建的,甚至工作区都不存在,它们都在一个大事务中进行大保存,我当前的解决方案是构建工作区变量和工作区环境,然后根据它们的索引将工作区环境与工作区环境变量值相关联。

:归属可以是可选的,我们只需附加',可选:true',您可以将记录保存到数据库中而不会出现任何问题。但是要小心,也就是说,您让对象处于无效状态(从业务逻辑的角度来看),不要忘记更新保存的记录并添加外部id值

class VariableValue < ApplicationRecord
  belongs_to :environment, optional: true
  belongs_to :variable, optional: true
类变量值
您可以发布模型的代码吗?一种解决方案是使用UUID键而不是顺序整数。这允许前端为新记录生成密钥。有关更多详细信息,请参见和。@moveson这当然是可能的,即使没有实际使用UUID,我也考虑过在react中为它们提供一个临时UID,然后在保存工作区_envs后,创建一个UID到ID的映射,然后创建与联接模型的关联谢谢回答,但是,是的,我知道可选的,我不想处理模型可能出现的容易出错的状态。这个解决方案还需要我先保存变量和环境,然后保存VariableValue