计量单位转换为宝石

问题描述

| 对于我的Rails项目,我正在寻找一个可以转换质量,体积和其他单位的库。 我需要将千克转换成克,升转换成汤匙等。 我认为,它应该像这样:
class Product < ActiveRecord:Base
  acts_as_physical_unit,:volume,:mass,:count
end

class Ingredient < ActiveRecord:Base
  acts_as_physical_unit,:count
end

olive_oil = Product.new(:name => \"Olive Oil\",:volume => \"1000 ml\")

caesar_salad = Recipe.new(:name => \"Caesar salad\",:ingredients => [
    Ingredient.new(:product => [olive_oil],:volume => \"5 tablespoons\")
  ]

# In ingredients of \"Caesar Salad\" are 5 tablespoons of \"Olive Oil\" specified.
# We should create \"Caesar Salad\" for 50 persons.
# How mutch bottles of \"Olive Oil\" should be ordered ?
order = OrderItem.new(
  :product => olive_oil,:count => olive_oil.count_for(caesar_salad.ingredients.first)) * 50
)
这样的宝石还存在吗? 谢谢。     

解决方法

        您可能要尝试使用ruby-units: 您可以检查单位定义以了解它是否适​​合您!     ,        您可以使用Unitwise做到这一点。它专为大量科学单位的单位换算和测量数学而设计。它不了解Rails,但连接起来应该很容易:
require \'unitwise/ext\'

class Ingredient < ActiveRecord::Base
  # store the value as milliliter in the database
  def volume=(amount)
    super(amount.convert_to(\'ml\').to_f)
  end

  # convert the value to a measurement when retrieved
  def volume
    super().convert_to(\'ml\')
  end
end

# Now you can initialize by sending a number (assumed to be in ml)
cooking_wine = Ingredient.new(name: \'Cooking Wine\',volume: 750)

# Or send any other volume measurement
olive_oil = Ingredient.new(name: \'Olive Oil\',volume: 1.liter)
cumin = Ingredient.new(name: \'Cumin\',volume: 5.teaspoon)

# Now volume returns a measurement
cooking_wine.volume # => #<Unitwise::Measurement 750.0 ml>

# And the volume can be converted to whatever you want.
olive_oil.volume.convert_to(\'gallon\') # => #<Unitwise::Measurement 0.21996924829908776 gallon>

# Use .to_f to get just the numeric value
cumin.volume.convert_to(\'cup\').to_f # => 0.10416666666666666

# You can perform whatever math you need on the volumes as well:
2.0 * (olive_oil.volume + cooking_wine.volume) => #<Unitwise::Measurement 3500.0 ml>