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

问题描述 投票:0回答:5

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

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

我看到了一些选择:

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

什么是正确的结构方式?谢谢!

javascript ruby-on-rails weather temperature
5个回答
6
投票

在内部存储一个表格,它应该是国际标准化的摄氏量表。

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


1
投票

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


1
投票

这是我做的:

  1. 决定以摄氏度存储温度
  2. 在我的天气报告模型上创建了一个名为air_temp_imperial的虚拟属性
  3. 使用了一个名为air_temp_imperial的setter,它执行从英制到摄氏的转换,然后将值保存到:air_temp
  4. 使用getter air_temp_imperial将转换后的摄氏温度返回到英制值

然后在我的观点中,我检查了current_user偏好帝国?修改我的演示文稿和表单的价值。

我不确定这是不是正确的方式,但似乎有效。


0
投票

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

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


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
© www.soinside.com 2019 - 2024. All rights reserved.