2

当父母没有孩子并且当父母有孩子时不显示它时,是否有任何技巧来创建默认孩子?after_create 回调本身并不能单独解决问题。现在,如果用户创建 3 个孩子并且您调用“parent.children”,结果不仅包含这 3 个孩子,还包含自动创建的孩子。

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

示例:
我的产品模型有很多变体。客户可以订购变体,因此我们需要变体。但有时管理员不想添加变体,并认为没有变体的产品就足够了。所以我们需要一个默认变体来让客户订购。也许 2 个月后,管理员来添加一个变体,从这个时候开始,我们不再想要默认的了。我一直在为这个问题寻找一个好的和干净的解决方案

4

2 回答 2

4

after_create应该可以正常工作,假设您在保存父母之前关联了任何孩子:

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 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
于 2013-09-10T12:42:25.363 回答
0

只需在after_create回调中调用这样的方法即可。

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

如果孩子关联中没有任何孩子,这只会创建 Child 对象。

于 2013-09-10T12:42:25.387 回答