Time in text_field

如果一个model中含有时间字段,那么add a new object的时候,我们可以使用datetime_select helper method to render it as a list of drop down lists, 就是,年月日小时,分都显示成一个droplist,可以选择。

当然,并不是所有人都喜欢这种输入方式。如果用户可以通过文本的方式输入时间,岂不是更好?然后由我们的程序进行解析然后存储到数据库中。

这么做意味着我们显示出来的字段跟数据库中实际存储的字段不一致。我们可以通过虚拟属性来记录这个新的string字段。

首先修改一些view中的代码
<%form_for @task do |form|%>
<%= form.text_field :due_at_string%>
<%= submit_tag "Edit task"%>
<%end%>

下面我们就要为这个虚拟属性添加getter and setter 方法了。
def due_at_string
due_at.to_s(:db)
end
def due_at_string=(due_at_str)
[u][b]self.due_at = Time.parse(due_at_str)[/b][/u]
end

谢天谢地,Time这个class已经给我提供了parse这个类方法,它将字符串解析成Time对象。

但是有时候,parse不能满足我们的要求,我们需要更多的时间格式,我们可以使用Chronic gem。
gem install chronic 即可。
使用时,要在你的类的开头加入 require 'chronic'
然后把Time.parse 替换成 Chronic.parse
Chronic 比 Time的一点好处是, 他可以 转换相对时间,比如tomorrow, monday, 甚至next tuesday at 8pm 之类的。
很强大把!

如果碰到不能parse的,Chronic会返回nil。
但是如果Time.parse 碰到不能parse的,它会返回一个ArgumentError Exception.
因此,如果我们使用的是Time的parse,就要添加一个rescue block,来对付这异常。
代码如下:
# def due_at_string=(due_at_str)
# self.due_at = Time.parse(due_at_str)
# rescue ArgumentError
# @due_at_invalid = true
# end
如果碰到这个异常,那么我们把实例变量置为true来标记。
然后在validate method中(这个方法在属性写入数据库之前会被自动执行的。)
如果这个变量为true,就往对象的errors属性中加入一个新的error(这个errors对象是一直存在着的。(从ActiveRecord继承的?也许把))

# def validate
# errors.add(:due_at, "is invalid") if @due_at_invalid
# end #第一个参数是字段名称,第二个参数是要显示出来的错误信息字符串。


还有最后需要注意的一点,对于Time.parse方法,如果他的参数是一个完全不合法的参数,或者根本没有参数,那么rails不会生成一个异常,而是会使用默认的Time.now作为替代,比如我们传入一个字符串(hello world), 那么不会报错,而是会存储成current time。

但是如果传入的是32-12-2009, 那么就肯定会报错了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# 预测f_PM25per1h def pre_data(): # 创建新窗口和 GUI 元素 pre_window = tk.Toplevel(window) pre_window.title("数据预测") # 创建下拉菜单 selected_field = tkinter.StringVar(pre_window) selected_field.set("f_id") # 设置默认选项 field_dropdown = tkinter.OptionMenu(pre_window, selected_field, "f_id", "f_areacode", "f_area", "f_time", "f_place", "f_AQI", "f_AQItype", "f_PM25per1h", "f_PM10per1h", "f_COper1h", "f_NO2per1h", "f_O3per1h", "f_O3per8h", "f_SO2per1h", "f_majorpollutant") field_dropdown.pack(side="left") # 创建输入框 search_entry = tkinter.Entry(pre_window) search_entry.pack(side="left") # 创建查询按钮 search_button = tkinter.Button(pre_window, text="预测", command=lambda: predict(search_entry.get())) search_button.pack() result_label = tk.Label(pre_window, text="") result_label.pack() # 实现预测函数 def predict(x): # 建立与 SQLite 数据库的连接 conn6 = sqlite3.connect('exp11.db') c6 = conn6.cursor() # 查询数据库中的数据 c6.execute("SELECT f_AQI, f_PM25per1h FROM table11") data6 = c6.fetchall() x_data = [item[0] for item in data6] y_data = [item[1] for item in data6] # 构建线性回归模型并进行训练 model = LinearRegression() model.fit([[x] for x in x_data], y_data) try: x = float(x) y_pred = model.predict([[x]])[0] result_label.config(text=f"预测值f_PM25per1h为:{round(y_pred, 2)}") except ValueError: result_label.config(text="请输入有效的数值!") # 关闭数据库连接 conn6.close() # 启动窗口事件循环 pre_window.mainloop()帮我修改这段代码使其可以预测数据
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值