0

我对 Rails 比较陌生,我正在构建一个处理天气数据的应用程序。我的主要用途将在美国境内,因此向用户展示的内容大概是华氏度。我使用的数据馈送以摄氏度为单位。

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

我看到了一些选择:

  1. 在内部存储 F。仅在我使用天气数据馈送时转换为 C。假设我从来没有在一个地区拥有健全的测量系统的用户。
  2. 在内部存储 C。在视图中转换为 F(如果用户的偏好是查看 F)。这会很棘手value,因为据我所知,需要在 Rails 视图和 JS 中实现转换公式。
  3. 在内部存储 C。根据上下文转换为 F,即当创建一个type温度为温度且用户偏好华氏温度的记录时,运行一个before_save执行转换的回调。不知道读什么...

构建这个的正确方法是什么?谢谢!

4

5 回答 5

6

内部存放一张表格,应该是国际标准的摄氏度。

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

于 2012-09-17T07:30:09.487 回答
1

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

于 2012-09-17T07:32:34.973 回答
1

这是我所做的:

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

然后在我看来,我检查了 current_user 首选项帝国?修改我的演示文稿和表格的价值。

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

于 2014-11-04T17:58:24.680 回答
0

我沉思了一下@Alnitak 给出的非常普遍的回应,并弄清楚了我需要做什么。我有一个temperature类型。所以我不理会那种类型,让它成为摄氏温度。然后我添加一个新类型temperature_fahrenheit。然后我的模型中有一个 :before_save 回调,它执行 F 到 C 的转换。这样,我将内部数据始终保留为摄氏温度,但仍然可以轻松地以华氏温度提交表单。

现在看起来很明显,但它已经逃离了我一段时间。

于 2012-09-20T04:49:06.880 回答
0

这是一个老问题......但是,......

我的用户输入 temp 作为浮点数。我有一个“温度刻度”(摄氏度或华氏度)的枚举。对于转换,我创建了一个初始化程序“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
于 2019-03-25T15:24:49.597 回答