我对Rails相对较新,我正在构建一个处理天气数据的应用程序。我的主要用途是在美国境内,因此用户的演示可能是华氏度。我消耗的数据Feed以摄氏度为单位。
我解决这个问题的正常方法是在模型中有一个celsius
列,然后是一个从F转换为C的自定义fahrenheit
模型方法。但是,由于各种设计决策我没有特定的温度场。 (tl; dr我正在跟踪除天气以外的许多不同的环境条件,因此我有一个通用的value
列和一个type
列。)
我看到了一些选择:
value
的公式需要在Rails视图和JS中实现,就我所见。type
为温度并且用户偏好华氏温度的记录时,运行进行转换的before_save
回调。我不知道该怎么办阅读... 这种结构的正确方法是什么?谢谢!
答案 0 :(得分:6)
在内部存储一个表单,它应该是国际标准化的Celcius表。
其他任何事情都是演示问题。
答案 1 :(得分:1)
我想说将它存储在数据库中的一个演示文稿(C或F)中,并在JS中将其转换为客户端。这也使得编写功能变得微不足道,因此用户可以决定他/她自己在没有往返服务器的情况下在C和F之间切换。
答案 2 :(得分:1)
这是我做的:
然后在我的观点中,我检查了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