当我使用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和日期格式。