ActiveRecord 4无法检索“选择AS”字段

时间:2013-11-20 17:50:01

标签: activerecord ruby-on-rails-4

好吧,我觉得这个问题真的很愚蠢,但它让我疯了,我无法理解。文档说我应该能够在Rails / ActiveRecord查询中使用select AS。所以:

d = Dvd.where(id: 1).select("title AS my_title")

是一个有效的查询,如果我对它进行to_sql,它会产生预期的SQL:

SELECT title AS my_title FROM `dvd`  WHERE `dvd`.`id` = 1

但是,d.my_title会出错:

NoMethodError: undefined method `my_title' for #<ActiveRecord::Relation

我需要能够使用AS,因为我要从不同联接中检索的列具有相同的名称,因此我无法以“常规”方式访问它们并且必须使用{{1 }}

我也不想使用AS来实现以后的兼容性以及从Mysql到PostGresql的可能转换。

只是为了澄清一下,我真正想做的是以Railsy的方式编写这个SQL:

find_by_sql

最好的例子只是简化SELECT tracks.name AS track_name, artists.name AS artist_name, composers.name AS composer_name, duration FROM `tracks_cds` INNER JOIN `tracks` ON `tracks`.`id` = `tracks_cds`.`track_id` INNER JOIN `artists` ON `artists`.`id` = `tracks_cds`.`artist_id` INNER JOIN `composers` ON `composers`.`id` = `tracks_cds`.`composer_id` WHERE cd_id = cd.id 不会让您轻松引用自我难以置信的自定义字段的事实。

2 个答案:

答案 0 :(得分:0)

您可以编写sql查询,然后只需传入ActiveRecord的execute方法

query = "SELECT title AS my_title FROM `dvd`  WHERE `dvd`.`id` = 1"
result = ActiveRecord::Base.connection.execute(query)

答案 1 :(得分:0)

ActiveRecord会根据数据库中的列名自动为属性创建getter和setter方法,因此不会为my_title定义任何属性。

关于相同的通用名称,为什么不这样做:

d = Dvd.where(id: 1).select("dvds.title")