我有以下设置
Class Country
include Mongoid::Document
field :name
field :code
has_many :locations
end
Class Location
include Mongoid::Document
field :country
field :region
field :city
has_many :locations
embedded_in :company
end
Class Company
include Mongoid::Document
field :name
embeds_one :location
accepts_nested_attributes_for :location
end
国家模型适用于所有国家/地区。
国家/地区通过嵌套表单在位置模型中存储其2个字母的短代码。例如“美国”。 现在我想在视图中调用@ company.location.country.name来获取“美国”,但是我收到了错误
undefined method `name' for nil:NilClass
我该怎么做呢? 什么是最好的方式? 我是MongoDB的新手,所以如果这是一个愚蠢的问题我会道歉
答案 0 :(得分:1)
我认为您的问题与您在国家/地区定义的反向关系有关。是的,位置可以有国家/地区,但国家/地区无法链接到位置,因为它是嵌入式文档。
尝试删除Country类中的has_many :locations
。这应该解决它。如果您不需要,请不要定义反向关系。
如果您需要反向关系,您可能不希望它作为嵌入式文档。
答案 1 :(得分:1)
由于给定的原因(嵌入式和关系),这不会起作用。
另一方面,对于您的问题,您不应该在数据库中存储国家/地区的全名。
确实这是一个"固定"列表,确切地说,它是ISO-3166-1。有标准时接受标准(罕见!)。一个好方法是使用区域设置(并且您可以节省种子,同步,更新部件)。
考虑文件config/locales/iso-3166-1/en.yml
:
en:
countries:
AD: "Andorra"
AE: "United Arab Emirates"
AF: "Afghanistan"
AG: "Antigua and Barbuda"
...
现在,您可以使用I18n.t(@mylocation.country, :scope => :countries)
。
奖金,它是i18n / l10n准备好了:config/locales/iso-3166-1/fr.yml
:
fr:
countries:
AD: "Andorre"
AE: "Émirats arabes unis"
AF: "Afghanistan"
AG: "Antigua-et-Barbuda"
...