rails在父级没有子级时创建默认子级,在父级子级子级时不显示子级

时间:2013-09-10 12:25:25

标签: ruby-on-rails associations

当父母没有孩子并且父母有孩子时没有显示默认孩子会有什么技巧吗? after_create回调本身并不能单独解决问题。如果用户创建3个子节点并且你调用“parent.children”,结果不仅包含这3个子节点,还包含自动创建的子节点。

更新:我只有在没有其他孩子的情况下才需要自动创建的孩子,当有,我不希望自动创建的孩子是“父母”的结果。儿“

示例:
我有一个有很多变种的产品型号。顾客可以订购一个变种,所以我们需要一个变种。但有时管理员不想添加变体,并认为产品没有足够的变种。所以我们需要一个默认变体让客户订购。可能2个月后,管理员来了并添加一个变体,从这时起,我们不再需要默认的了。我正在为这个问题寻找一个漂亮而干净的解决方案

2 个答案:

答案 0 :(得分: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

如果您之后需要删除这个孩子,如果稍后添加了新孩子,则您需要有一个&#39;默认&#39;标记要删除的子项,然后添加一个回调以触发默认的子项删除。

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

答案 1 :(得分:0)

只需在after_create回调中调用此类方法即可。

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

如果子关联中没有子节点,则只会创建Child对象。