如何从Mongoid嵌入子类B中访问父类A的属性?
如何在Mongoid嵌入文档中访问父文档的属性?
你遇到的问题是对Mongoid关联方法的返回值理解有误——embedded_in :a给B类生成的a方法,返回的是父文档A的实例对象,而非哈希,所以直接用a[:name]会报错或返回异常结果。
下面是两种正确的访问方式,推荐第一种:
1. 直接调用属性访问器(最常用)
Mongoid会为每个字段自动生成对应的属性方法,你可以直接通过父文档实例调用:name属性:
class B include Mongoid::Document embedded_in :a def vat=(value) # 这里可添加你需要的赋值逻辑,比如同步到父文档字段等 end def vat # 用安全导航操作符&.,避免父文档未关联时抛出NilError a&.name end end
2. 哈希风格的兼容访问
其实Mongoid的文档实例也支持哈希式键值访问,但同样要处理父文档为nil的情况:
def vat a&.[](:name) end
关键注意点
- 务必加上
&.安全导航操作符:如果B实例还未嵌入到任何A实例中,a方法会返回nil,直接调用a.name会抛出NoMethodError,&.会自动处理这种情况,返回nil而非报错。 - 确保父文档已加载:由于是
embeds_one关联,父文档本身包含B实例,一般不会有加载问题,但复杂场景下可使用a.reload强制加载。
内容的提问来源于stack exchange,提问作者Michael H.
相关产品推荐
相关产品推荐

