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

国モデルには、すべての国がシードされています。

国は、ネストされたフォームを介して Location モデルに 2 文字のショートコードで保存されます。たとえば、「米国」。ビューで @company.location.country.name を呼び出して「米国」を取得したいのですが、エラーが発生しています

undefined method `name' for nil:NilClass

どうすればこれを行うことができますか?最善の方法は何ですか?私はMongoDBを初めて使用するので、これがばかげた質問であれば申し訳ありません

4

2 に答える 2

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 に答える
1

あなたの問題は、国で定義している逆の関係に関連していると思います。はい、場所は国を持つことができますが、埋め込みドキュメントであるため、国は場所にリンクできません。

has_many :locationsCountry クラスの を削除してみてください。これで解決するはずです。必要がない場合は、逆リレーションを定義しないでください。

逆の関係が必要な場合は、おそらく埋め込みドキュメントとして使用したくないでしょう。

于 2012-07-03T12:22:08.843 に答える