2013-11-20 67 views
1

好的,我對這個問題感到非常愚蠢,但這讓我感到非常緊張,我無法弄清楚。文檔說我應該能夠在Rails/ActiveRecord查詢中使用select AS。所以:ActiveRecord 4無法檢索「選擇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,因爲我想從不同的連接檢索的列具有相同的名稱,所以我不能以「常規」的方式訪問它們,而必須求助於使用AS

我也不想訴諸使用find_by_sql未來的兼容性和從MySQL到PostGresql的可能切換形式。

只是爲了澄清,我真正想要做的是寫SQL的方式Railsy:

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 

頂部例子只是一個事實是簡化SELECT AS不會給你一個簡單的方式來引用我覺得很難相信的自定義字段。

回答

0

你可以寫你的SQL查詢,然後就進入的ActiveRecord的execute方法

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

不僅你的代碼返回一個錯誤的'結果='(即使你刪除冗餘'execute',試試吧),但這和做'find_by_sql'幾乎是一樣的,我說我寧願不這樣做。 – kakubei

0

ActiveRecord的自動創建基於數據庫中列名的屬性getter和setter方法,所以會出現對沒有定義my_title

關於同一通用名,爲什麼不只是這樣做:

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

因爲我需要自定義字段來檢索它的值並創建一個JSON哈希值。爲了更加清晰,我會編輯原始帖子。 – kakubei

+0

@kakubei爲什麼不只是在你的模型中重寫'as_json'來渲染JSON的方式? – micahbf

+0

我們已經這樣做了,但它並不能幫助我以最佳方式將數據從數據庫中提取出來。我仍然有「選擇爲」的困境。另外請注意,我已經通過使用find_by_sql解決了它。只是想要一個更Railsy的做法。 – kakubei