当父母没有孩子并且父母有孩子时没有显示默认孩子会有什么技巧吗? after_create回调本身并不能单独解决问题。如果用户创建3个子节点并且你调用“parent.children”,结果不仅包含这3个子节点,还包含自动创建的子节点。
更新:我只有在没有其他孩子的情况下才需要自动创建的孩子,当有,我不希望自动创建的孩子是“父母”的结果。儿“
示例:
我有一个有很多变种的产品型号。顾客可以订购一个变种,所以我们需要一个变种。但有时管理员不想添加变体,并认为产品没有足够的变种。所以我们需要一个默认变体让客户订购。可能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对象。