当我使用find_by_sql别名时,我感到困惑

时间:2014-04-09 08:07:22

标签: mysql ruby-on-rails alias

我正在使用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不允许相同的列名和别名?我错过了什么吗? 提前谢谢。

1 个答案:

答案 0 :(得分:2)

您正在从数据库中主动加载Books,因此AREL会尝试将您的select语句映射到模型。在这种情况下,它将日期映射到borrow_date属性并将其转换为Date对象。您选择的原始格式不再相关,因为它被解析为具有自己的打印日期规则的对象。

您的第二个选择有效,因为Book模型上可能没有该名称的属性,因此无法将其映射到特定类型,因此使用了普通String

您可以简单地向模型中添加formatted_borrow_date之类的函数,或使用帮助程序使用ruby方法格式化borrow_date以避免硬编码的SQL和日期格式化。