ruby-on-rails - Rails 在父级没有子级时创建默认子级,而在父级有子级时不显示它

标签 ruby-on-rails associations

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

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

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

最佳答案

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

关于ruby-on-rails - Rails 在父级没有子级时创建默认子级,而在父级有子级时不显示它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18718929/

相关文章:

mysql - 使用 rails 创建模型时如何为列指定排序规则

ruby-on-rails - Ransack with kaminari on rails 4.1 错误,搜索字符串为空

ruby-on-rails - 如何在 Rails 4 中设置自定义字符串外键?

ruby-on-rails - Rails 中的 SimpleCov 开销

ruby-on-rails - 如何使用 Ruby on Rails 随机选择要显示的内容

ruby-on-rails - 如何根据规范更改 Rails 应用程序配置?

ruby-on-rails - 在 Rails 中找不到关联问题

ruby-on-rails - 通过关联新建模型对象

ruby-on-rails - 如何使用 STI 建立 ActiveRecord 关联

node.js - Sequelize include 不适用于关联表