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

接下来,我正在构建一个用于我的应用程序的模型。假设我想创建一个名为 Location 的东西:

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,只是查找它。

这样做的“正确”方法是什么?我可以想到两种方法——简单的方法似乎只是定义一个进行查找的方法,如下所示:

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在你的SalesTaxRate. 但是如果你这样做,你应该注意几件事:首先,导入数据中的所有邮政编码都必须是唯一的。其次,您的位置模型不能有任何不可用的邮政编码,SalesTaxRate否则您将面临问题。

于 2013-01-22T04:24:30.383 回答