0

我有以下设置

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 字母短代码存储在 Location 模型中。例如“美国”。现在我想在视图中调用@company.location.country.name 以获取“美国”,但是我收到了一个错误

undefined method `name' for nil:NilClass

我该怎么做呢?最好的方法是什么?我是 MongoDB 新手,所以如果这是一个愚蠢的问题,我深表歉意

4

2 回答 2

1

我认为您的问题与您在 Country 上定义的反向关系有关。是的,位置可以有一个国家,但国家不能链接到该位置,因为它是一个嵌入式文档。

尝试删除has_many :locationsCountry 类中的 。这应该解决它。如果不需要,不要定义反向关系。

如果您需要反向关系,您可能不希望它作为嵌入文档。

于 2012-07-03T12:22:08.843 回答
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"
    ...
于 2012-07-14T08:41:07.283 回答