Mongoid与预定义对象模型的关系?

时间:2013-01-21 21:50:48

标签: ruby-on-rails mongoid

这是我的用例:

我收到了一系列已从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设置费率,只是查找它。

"对"是什么?这样做的方法?我可以想到两种方法 - 简单的方法似乎只是定义一个执行查找的方法,如下所示:

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

这很有效。但是我想知道我是否应该使用belongs_to关联,如果是的话,为什么以及如何最好地使用它。

仍然在这里学习绳索,如果这是一个新手/愚蠢的问题,请道歉。非常感谢提前!

1 个答案:

答案 0 :(得分:1)

如果您在模型zip_code中的SalesTaxRate上有索引,那么您所执行的操作与belongs_to的操作基本相同。只需检查代码即可确保它不会失败:

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中没有的任何邮政编码,否则您将面临问题。