存储数据库中引用的常量的最佳方法是什么?

7 ruby ruby-on-rails

在我的数据库中,我有一个模型,其中有一个字段应该从一个选项列表中选择.例如,考虑需要存储测量的模型,例如5英尺或13厘米或12.24立方米.实现这一目标的显而易见的方法是使用十进制字段,然后使用其他字段来存储测量单位.

那么存储测量单位的最佳方法是什么?我过去曾使用过几种方法:

1)将各种选项存储在另一个数据库表(和相关模型)中,并将两者与标准外键相关联(通常需要加载相关模型).这似乎有点矫枉过正,因为你强迫数据库在每个查询上执行连接.

2)将选项存储为常量哈希值,加载到其中一个初始值设定项中,其中哈希值中的键存储在测量单位字段中.这样,您可以有效地在Ruby中进行连接(可能会或可能不会提高性能),但是您无法从"度量单位"方面进行查询.这不会是一个问题,只要你不太可能需要进行"以cm为单位找到所有测量值"的查询.

这些都不觉得我特别优雅..任何人都能提出更好的建议吗?

Ben*_*eld 6

你见过constant_cache吗?它是1和2中最好的组合 - 查找数据存储在数据库中,但它在查找模型上作为类常量公开,仅在应用程序启动时加载,因此您不会经常遇到连接惩罚.以下示例来自README:

移民:

create_table :account_statuses do |t|
  t.string :name, :description
end

AccountStatus.create!(:name => 'Active',   :description => 'Active user account')
AccountStatus.create!(:name => 'Pending',  :description => 'Pending user account')
AccountStatus.create!(:name => 'Disabled', :description => 'Disabled user account')
Run Code Online (Sandbox Code Playgroud)

模型:

class AccountStatus < ActiveRecord::Base
  caches_constants
end
Run Code Online (Sandbox Code Playgroud)

使用它:

Account.new(:username => 'preagan', :status => AccountStatus::PENDING)
Run Code Online (Sandbox Code Playgroud)


tzo*_*zot 3

我会选择选项一。UnitOfMeasurement 表有多大?而且,如果使用整数主键,为什么您如此担心速度?

出于设计原因,选项 1 是最佳选择。只需使用整数(甚至是小整数)主键和单位描述字段来声明它。