好吧,我觉得这个问题真的很愚蠢,但它让我疯了,我无法理解。文档说我应该能够在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
不会让您轻松引用自我难以置信的自定义字段的事实。
答案 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")