Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.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 rails在父项不存在时创建默认子项';Don’不要生孩子,当父母有孩子的时候就不显示_Ruby On Rails_Associations - Fatal编程技术网

Ruby on rails rails在父项不存在时创建默认子项';Don’不要生孩子,当父母有孩子的时候就不显示

Ruby on rails rails在父项不存在时创建默认子项';Don’不要生孩子,当父母有孩子的时候就不显示,ruby-on-rails,associations,Ruby On Rails,Associations,当父母没有孩子时,有没有什么技巧可以创建默认的孩子,而当父母有孩子时却不显示?创建后回调本身并不能解决问题。现在,如果用户创建3个子项,而您调用“parent.children”,则结果不仅包含这3个子项,还包含自动创建的子项 更新:只有当没有其他子项时,我才需要自动创建的子项,并且当有子项时,我不希望自动创建的子项包含在“parent.children”的结果中 示例: 我有一个产品模型,有很多变体。客户可以订购变体,因此我们需要一个变体。但有时管理员不想添加变体,认为没有变体的产品就足够了。

当父母没有孩子时,有没有什么技巧可以创建默认的孩子,而当父母有孩子时却不显示?创建后回调本身并不能解决问题。现在,如果用户创建3个子项,而您调用“parent.children”,则结果不仅包含这3个子项,还包含自动创建的子项

更新:只有当没有其他子项时,我才需要自动创建的子项,并且当有子项时,我不希望自动创建的子项包含在“parent.children”的结果中

示例:

我有一个产品模型,有很多变体。客户可以订购变体,因此我们需要一个变体。但有时管理员不想添加变体,认为没有变体的产品就足够了。因此,我们需要一个默认变体来让客户订购。可能2个月后,管理员来添加变体,从现在起,我们不再需要默认变体。我正在为这个问题寻找一个好的、干净的解决方案

只需在创建后的
回调中调用这样的方法

def create_child_if_needed
  Child.create(:parent_id => self.id) unless self.children.any?
end

这将仅在子对象关联中没有任何子对象时创建子对象。

只需在创建后的
回调中调用类似的方法即可

def create_child_if_needed
  Child.create(:parent_id => self.id) unless self.children.any?
end

仅当子对象关联中没有任何子对象时,此操作才会创建子对象。

在创建后应该可以正常工作,假设您在保存父对象之前关联了所有子对象:

class ParentModel < ActiveRecord::Base
  has_many :child_models
  after_create :ensure_child_exists

  def ensure_child_exists
    child_models.create(default: true) unless child_models.exists?
  end
end
class-ParentModel
如果您随后需要删除此子项(如果以后添加了新的子项),则需要在子项上设置一个“默认”标志以标识是否要删除,然后添加一个回调以触发默认子项删除

class ChildModel < ActiveRecord::Base
  attr_accessible :default
  belongs_to :parent
  after_create :remove_default_if_unneeded

  scope :default, -> { where(default: true) }

  def remove_default_if_unneeded
    parent.child_models.default.destroy_all unless self.default?
  end
end
class-ChildModel{where(默认值:true)}
def删除默认值(如果不需要)
parent.child\u models.default.destroy\u all,除非self.default?
结束
结束

在创建后,如果您在保存父项之前关联了所有子项,则应该可以正常工作:

class ParentModel < ActiveRecord::Base
  has_many :child_models
  after_create :ensure_child_exists

  def ensure_child_exists
    child_models.create(default: true) unless child_models.exists?
  end
end
class-ParentModel
如果您随后需要删除此子项(如果以后添加了新的子项),则需要在子项上设置一个“默认”标志以标识是否要删除,然后添加一个回调以触发默认子项删除

class ChildModel < ActiveRecord::Base
  attr_accessible :default
  belongs_to :parent
  after_create :remove_default_if_unneeded

  scope :default, -> { where(default: true) }

  def remove_default_if_unneeded
    parent.child_models.default.destroy_all unless self.default?
  end
end
class-ChildModel{where(默认值:true)}
def删除默认值(如果不需要)
parent.child\u models.default.destroy\u all,除非self.default?
结束
结束

请发布您当前用于创建子对象的方法…没有特殊方法!只是一个简单的联想。@Pooya似乎有几个人很难理解你的问题。您能解释一下为什么需要默认的子记录吗?该默认子记录是否需要保留在数据库中,或者是否可以根据需要进行实例化?我有一个产品模型,其中包含许多变体。客户可以订购变体,因此我们需要一个变体。但有时管理员不想添加变体,认为没有变体的产品就足够了。因此,我们需要一个默认变体来让客户订购。可能2个月后,管理员来添加变体,从现在起,我们不再需要默认变体。我正在为这个问题寻找一个好的、干净的解决方案。自动创建的子项是否需要存在于数据库中?或者可以动态地创建它?如果需要将其保存在数据库中,则必须执行类似于在子级中设置字段的操作,例如“默认值是多少?”?或者是自动创建的?。然后在控制器中,在添加新的子节点之前,您需要删除具有默认值或自动创建集的所有节点,可能需要将其包装到事务中。如果可以动态创建,您可以在nil上进行营救并创建它。请发布您当前用于创建子项的方法…没有特殊方法!只是一个简单的联想。@Pooya似乎有几个人很难理解你的问题。您能解释一下为什么需要默认的子记录吗?该默认子记录是否需要保留在数据库中,或者是否可以根据需要进行实例化?我有一个产品模型,其中包含许多变体。客户可以订购变体,因此我们需要一个变体。但有时管理员不想添加变体,认为没有变体的产品就足够了。因此,我们需要一个默认变体来让客户订购。可能2个月后,管理员来添加变体,从现在起,我们不再需要默认变体。我正在为这个问题寻找一个好的、干净的解决方案。自动创建的子项是否需要存在于数据库中?或者可以动态地创建它?如果需要将其保存在数据库中,则必须执行类似于在子级中设置字段的操作,例如“默认值是多少?”?或者是自动创建的?。然后在控制器中,在添加新的子节点之前,您需要删除具有默认值或自动创建集的所有节点,可能需要将其包装到事务中。如果它可以动态创建,你可以在nil上进行拯救并构建它。你没有遇到问题。现在,如果用户创建3个子项,您调用“parent.children”,结果不仅包含这3个子项,还包含自动创建的子项。您没有遇到问题。现在,如果用户创建3个子项,您调用“parent.children”,则结果