mongoid association引用嵌入式模型

时间:2012-07-02 23:31:40

标签: ruby-on-rails ruby-on-rails-3 mongodb ruby-on-rails-3.1 mongoid

我有以下设置

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的新手,所以如果这是一个愚蠢的问题我会道歉

2 个答案:

答案 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"
    ...