在简化设置中,我有4个模型。
在我的反应应用程序中,您创建了一个应用程序,然后您可以独立创建环境和变量。每个变量都可以为每个环境赋值,因此我创建一个具有实际值的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相关联。
答案 0 :(得分:0)
:belongs_to可以是可选的,我们只需附加',optional:true',您可以将记录保存到数据库中而不会出现任何问题。但请注意,即将对象置于无效状态(从业务逻辑的角度来看),不要忘记更新已保存的记录并添加外部id值。
class VariableValue < ApplicationRecord
belongs_to :environment, optional: true
belongs_to :variable, optional: true