这是我的用例:
我收到了一系列已从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
关联,如果是的话,为什么以及如何最好地使用它。
仍然在这里学习绳索,如果这是一个新手/愚蠢的问题,请道歉。非常感谢提前!
答案 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
中没有的任何邮政编码,否则您将面临问题。