0

我有以下設置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,所以我很抱歉如果這是一個愚蠢的問題

+0

你爲什麼不有一個'has_and_bleongs_to_many'關係? – apneadiving

回答

1

我認爲你的問題與你在國家定義的反向關係有關。是的,位置可以有一個國家,但國家無法鏈接到該位置,因爲它是嵌入式文檔。

嘗試刪除Country類中的has_many :locations。這應該解決它。如果你不需要,不要定義反向關係。

如果您需要反向關係,您可能不希望它作爲嵌入式文檔。

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)

獎金,這是國際化/本地化準備:config/locales/iso-3166-1/fr.yml

fr: 
    countries: 
    AD: "Andorre" 
    AE: "Émirats arabes unis" 
    AF: "Afghanistan" 
    AG: "Antigua-et-Barbuda" 
    ...