如何获取Mobility gem扩展模型的可翻译属性?
解决Mobility翻译属性获取问题
1. 获取基础翻译字段数组([:name, :description])
直接调用模型类的translated_attribute_names方法就能拿到你配置的基础翻译字段:
Parent.translated_attribute_names # 返回结果:[:name, :description]
2. 获取带语言后缀的完整翻译字段数组([:name_en, :name_de, ...])
结合Mobility的可用语言列表和基础翻译字段,就能生成带语言后缀的完整字段数组:
# 先获取所有启用的语言 languages = Mobility.available_locales.map(&:to_s) # 生成带语言后缀的字段集合 full_translated_fields = Parent.translated_attribute_names.flat_map do |attr| languages.map { |lang| "#{attr}_#{lang}".to_sym } end # 返回结果示例:[:name_en, :name_de, :description_en, :description_de, ...]
3. 获取包含翻译属性的键值哈希
如果要拿到实例的所有翻译属性键值对,有两种实用方式:
- 方式一:通过实例的
translations方法遍历翻译对象拼接:
parent_instance.translations.each_with_object({}) do |t, hash| Parent.translated_attribute_names.each do |attr| hash["#{attr}_#{t.locale}".to_sym] = t.send(attr) end end
- 方式二:直接拼接原有属性和翻译属性:
languages = Mobility.available_locales.map(&:to_s) # 合并原有属性和所有翻译属性 full_attributes = parent_instance.attributes.merge( Parent.translated_attribute_names.flat_map do |attr| languages.map { |lang| ["#{attr}_#{lang}".to_sym, parent_instance.send("#{attr}_#{lang}")] } end.to_h )
内容的提问来源于stack exchange,提问作者Marat
相关产品推荐
相关产品推荐

