【问题标题】:Where to translate from Fahrenheit to Celsius in Rails app?在 Rails 应用程序中从哪里将华氏温度转换为摄氏温度?
【发布时间】:2012-09-17 07:19:34
【问题描述】:

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

我解决这个问题的正常方法是在模型中有一个 celsius 列,然后是一个自定义的 fahrenheit 模型方法,该方法从 F 转换为 C。但是,由于各种设计决策,我没有温度的特定字段。 (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


    【解决方案1】:

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

    其他的都是表现问题。

    【讨论】:

    • 我在处理体重时遇到了同样的情况。我有两个衡量重量的指标,KG 和 Pound。我使用 KG 作为内部表示,并在需要时转换为磅。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是我所做的:

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

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

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

      【讨论】:

        【解决方案4】:

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

        现在看起来很明显,但它一直在逃避我。

        【讨论】:

        • 虽然这是公认的答案,但我强烈建议不要使用这条路线。这对应用程序和数据库有数据重复和不必要的复杂性。接受的答案应该是将其描述为表示问题的答案,即使用 JavaScript 或至少使用 PORO ViewModel / Presenter 类来处理它。
        【解决方案5】:

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

        我的用户输入 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-23
          • 1970-01-01
          • 1970-01-01
          • 2012-06-21
          相关资源
          最近更新 更多