我有一个带有哈希字段的 Mongoid 模型。这个 Mongoid 模型使用单一集合继承来创建子类。现在我想为主模型的每个子类设置不同的默认哈希键。
主模型如下:
class Sport
include Mongoid::Document
field :rules, type: Hash, default: {}
end
我想设置不同的默认哈希键用于:rule哈希字段的子类。例如,对于足球,我想要规则:{:越位 =>'',:罚款 =>''}。对于拳击,我们可能有规则:{:咬人=>'不允许'}的哈希键。开源应用程序Errbit使用子类中的常量设置默认哈希键,但我可以看到它们如何使用该常量来填充哈希:https://github.com/errbit/errbit/blob/master/app/models/issue_trackers/github_issues_tracker.rb
class Sport::Football < Sport
end
class Sport::Boxing < Sport
end
我在子类中覆盖了字段定义,如下所示,在rails控制台中可以正常工作。当我执行a = Sport::Football.new然后调用a.smtp时,返回默认设置。但问题在于,当我转到父类并执行b = Sport.new和b.smtp时,我希望它能够列出子类的所有默认键,但实际上却不能,因为我在子类中重写了哈希字段。
class Sport::Football < Sport
field :rules, type: Hash, default: {:offside => '', :penalty => ''}
end
有没有一种方法可以在不覆盖字段定义的情况下为子类设置默认哈希键。可以通过在每个子类中覆盖哈希字段的setter和getter来实现这一点。
:default => :method_name
风格可以工作,但是没有成功(至少在 Mongoid3 中如此,在 Mongoid4 中可能值得一试),因此使用了 lambda 间接引用。 - mu is too short