0

これが私のユースケースです:

CSVファイルからインポートされた消費税率のコレクションがあります。フィールド名をミラーリングするためにMongoidモデルを作成しました(これらは変更できません)。

class SalesTaxRate
  include Mongoid::Document

  field :state, type: String
  field :zip_code, type: String
  field :tax_region_name, type: String
  field :tax_region_code, type: String
  field :combined_rate, type: Float
end

次に、アプリで使用するモデルを作成しています。ロケーションと呼ばれるものを作成したいとします。

class Location
  include Mongoid::Document

  field :name, type: String
  field :street, type: String
  field :city, type: String
  field :state, type: String
  field :zip_code, type: String
end

次のように呼び出すだけで、場所の消費税率を取得できるようにしたいと思います。

home = new Location(...)
home.sales_tax_rate

私はhomeそれを調べるだけで、を介してレートを設定することは決してありません。

これを行うための「正しい」方法は何ですか?私は2つのアプローチを考えることができます-簡単な方法は、ルックアップを行うメソッドを定義することであるように思われます。

class Location
  ...
  def sales_tax_rate
     SalesTaxRate.where(zip_code: self.zip_code).first.combined_rate
  end

そして、これは機能します。しかし、私はbelongs_to協会を使うべきかどうか、もしそうなら、なぜそしてどのようにそれをするのが最善か疑問に思っています。

まだここでロープを学んでいるので、これが初心者/愚かな質問である場合はお詫びします。よろしくお願いします!

4

1 に答える 1

1

zip_codeモデルにインデックスがある場合、あなたSalesTaxRateがしていることは本質的に何belongs_toをするかと同じです。コードに nil チェックを入れて、失敗しないようにします。

SalesTaxRate.where(zip_code: self.zip_code).first.try(:combined_rate)
# or
rate = SalesTaxRate.where(zip_code: self.zip_code).first
rate.nil? ? nil : rate.combined_rate

belongs_toそれでもルートに進みたい場合はzip_code、 で ID を定義できますSalesTaxRate。ただし、これを行う場合、いくつかの点に注意する必要があります。まず、インポートされたデータのすべての郵便番号が一意である必要があります。第 2 に、ロケーション モデルには、利用できない郵便番号を含めることはできませんSalesTaxRate。そうしないと、問題が発生します。

于 2013-01-22T04:24:30.383 に答える