在Rails应用程序中从华氏温度转换为摄氏温度?

时间:2012-09-17 07:19:34

标签: javascript ruby-on-rails weather temperature

我对Rails相对较新,我正在构建一个处理天气数据的应用程序。我的主要用途是在美国境内,因此用户的演示可能是华氏度。我消耗的数据Feed以摄氏度为单位。

我解决这个问题的正常方法是在模型中有一个celsius列,然后是一个从F转换为C的自定义fahrenheit模型方法。但是,由于各种设计决策我没有特定的温度场。 (tl; dr我正在跟踪除天气以外的许多不同的环境条件,因此我有一个通用的value列和一个type列。)

我看到了一些选择:

  1. 在内部存储F.我在使用天气数据源时只转换为C.假设我没有在具有健全测量系统的地方拥有用户。
  2. 在内部存储C.在视图中转换为F(如果用户的偏好是看F)。这很棘手,因为转换value的公式需要在Rails视图和JS中实现,就我所见。
  3. 在内部存储C.根据上下文转换为F,即在创建type为温度并且用户偏好华氏温度的记录时,运行进行转换的before_save回调。我不知道该怎么办阅读...
  4. 这种结构的正确方法是什么?谢谢!

5 个答案:

答案 0 :(得分:6)

在内部存储一个表单,它应该是国际标准化的Celcius表。

其他任何事情都是演示问题。

答案 1 :(得分:1)

我想说将它存储在数据库中的一个演示文稿(C或F)中,并在JS中将其转换为客户端。这也使得编写功能变得微不足道,因此用户可以决定他/她自己在没有往返服务器的情况下在C和F之间切换。

答案 2 :(得分:1)

这是我做的:

  1. 决定以摄氏度储存温度
  2. 在我的天气预报模型上创建了一个虚拟属性,名为:air_temp_imperial
  3. 使用了一个名为air_temp_imperial的setter,它执行从英制到摄氏的转换,然后将值保存到:air_temp
  4. 使用getter air_temp_imperial将转换后的摄氏度返回到英制值
  5. 然后在我的观点中,我检查了current_user偏好帝国?修改我的演示文稿和表格的价值。

    我不确定它是否正确,但它似乎有效。

答案 3 :(得分:0)

我对@Alnitak给出的非常一般的回应进行了冥想,并想出了我需要做些什么。我有一个temperature类型。所以我单独留下那种类型,让它成为Celsius。然后我添加了一个新类型temperature_fahrenheit。然后我在我的模型中有一个:before_save回调,它执行F到C的转换。这样我就可以将内部数据保留为摄氏温度,但仍然可以轻松地将表格提交给华氏温度。

现在看似显而易见,但它暂时逃脱了我。

答案 4 :(得分:0)

这是一个古老的问题。...但是...

我的用户输入temp作为浮点数。我有一个用于“ temperature_scale”(摄氏度或华氏度)的枚举。 对于转换,我创建了带有以下内容的初始化程序“ extend_float.rb”:

class Float

  def to_celcius
   ((self - 32) * 5/9).round(1)
  end

  def to_fahrenheit
    ((self * 9/5) + 32).round(1)
  end

end

那么您可以做:

thing = Thing.find(1)
return thing.celsius? ? thing.temperature.to_fahrenheit : thing.temperature