当我使用find_by_sql别名时,我感到困惑
我正在使用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不允许相同的列名和别名? 我错过了什么吗? 先感谢您。
您正在从数据库中主动加载Books
,因此AREL会尝试将select语句映射到模型。 在这种情况下,它将日期映射到borrow_date
属性并将其转换为Date对象。 您选择的原始格式不再相关,因为它被解析为具有自己的打印日期规则的对象。
您的第二个选择有效,因为Book
模型上可能没有该名称的属性,因此无法将其映射到特定类型,因此使用了纯String
。
您可以简单地将一个类似formatted_borrow_date
的函数添加到模型中,或者使用帮助程序borrow_date
使用ruby方法格式化borrow_date
以避免硬编码的SQL和日期格式。