我正在使用RoR和mysql数据库。 我想将timestamp列转换为字符串,所以我有SQL:
@books = Book.find_by_sql("select id, name, date_format(borrow_date, '%m/%d/%Y') borrow_date from books")
@books[0].borrow_date => 'Sun, 03 Aug 2014 17:00:00 PDT -07:00'
当我像@books [0] .borrow_date一样输出borrow_date时,我得到了未格式化的字符串'Sun,2014年8月3日17:00:00 PDT -07:00',这是不可取的。 我想要“08/03/2014”
如果我更改了与列名不同的别名,我会得到预期的数据字符串。
@books = Book.find_by_sql("select id, name, date_format(borrow_date, '%m/%d/%Y') borrow_date_other from books")
@books[0].borrow_date_other => "08/03/2014"
我不想在ruby代码中格式化日期字符串,因为我需要从oracle数据库中提取相同的数据,并且只想在使用前转换为字符串。
为什么RoR不允许相同的列名和别名?我错过了什么吗? 提前谢谢。
答案 0 :(得分:2)
您正在从数据库中主动加载Books
,因此AREL会尝试将您的select语句映射到模型。在这种情况下,它将日期映射到borrow_date
属性并将其转换为Date对象。您选择的原始格式不再相关,因为它被解析为具有自己的打印日期规则的对象。
您的第二个选择有效,因为Book
模型上可能没有该名称的属性,因此无法将其映射到特定类型,因此使用了普通String
。
您可以简单地向模型中添加formatted_borrow_date
之类的函数,或使用帮助程序使用ruby方法格式化borrow_date
以避免硬编码的SQL和日期格式化。