如果没有创建关联模型,如何处理创建连接模型?

时间:2017-04-11 01:19:09

标签: ruby-on-rails ruby ruby-on-rails-5

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

  • App:has_many Environments,Variables
  • 环境:has_many VariableValues
  • 变量:has_many VariableValues
  • VariableValue:belongs_to Environment,Variable

在我的反应应用程序中,您创建了一个应用程序,然后您可以独立创建环境和变量。每个变量都可以为每个环境赋值,因此我创建一个具有实际值的VariableValue,然后创建一个将变量值与环境相关联的environment_id和variable_id。保存这个,并且一次全部保存,我没有环境ID给连接模型,因为在创建VariableValues之前,变量或环境都不会被保留。我正在使用接受_nested_attributes来完成App的整个保存。可能无法做到这一点,所以我很好奇其他人是如何处理这种情况的。

谢谢!

更新:

以下是我的模特

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

这里重要的是所有这些模型都是同时创建的,甚至不存在Workspace,它都是大豁免,在一个大事务中,我目前的解决方案是构建workspace_variables和workspace_envs然后根据索引将workspace_envs与workspace_env_variables_values相关联。

1 个答案:

答案 0 :(得分:0)

:belongs_to可以是可选的,我们只需附加',optional:true',您可以将记录保存到数据库中而不会出现任何问题。但请注意,即将对象置于无效状态(从业务逻辑的角度来看),不要忘记更新已保存的记录并添加外部id值。

class VariableValue < ApplicationRecord
  belongs_to :environment, optional: true
  belongs_to :variable, optional: true