0

在我們的控制,我們試圖展示一個視頻系列,它應該返回JSON與此類似:爲什麼Rails .select別名將屬性更改爲小寫?

{ 
    id: 1, 
    name: "Series Name", 
    videos: [ 
    id:   2, 
    name:   "Video Name", 
    isInPlaylist: true, 
    isFavorite: false 
    ] 
} 

我們添加的isInPlaylist,並通過我們存儲數據,如果用戶曾擔任另一臺isInFavorite屬性視頻(評級,收藏等)。

videos = series.videos 
      .where('videos.is_live = true') 
      .joins("some join to user_videos join_table") 
      .select(
       'videos.*, 
       coalesce(user_videos.rating, 0.0) as user_rating, 
       coalesce(user_videos.enqueue, \'false\') as isInPlaylist, 
       coalesce(user_videos.favorite, \'false\') as isFavorite' 
      ) 

注意,在我們的select語句的屬性明確別名爲駱駝,套管值。但是,當我們執行此查詢時,將這些屬性返回爲小寫字母代替:

{ 
    isinplaylist: true, 
    isfavorite: false 
} 

回答

1

這不是一個Rails的行爲,而是一個SQL行爲。除非明確引用,否則別名將被摺疊爲小寫。例如,以下是psql(Postgres CLI程序)中的簡單查詢輸出。

=# select created_at as theTimeNow from users limit 5; 
     thetimenow   
---------------------------- 
2013-03-05 18:45:11.127092 
2013-09-07 16:43:01.349823 
2013-03-05 18:53:35.888306 
2013-09-07 16:53:06.553129 
2013-10-29 00:38:56.909418 
(5 rows) 


=# select created_at as "theTimeNow" from users limit 5; 
     theTimeNow   
---------------------------- 
2013-03-05 18:45:11.127092 
2013-09-07 16:43:01.349823 
2013-03-05 18:53:35.888306 
2013-09-07 16:53:06.553129 
2013-10-29 00:38:56.909418 
(5 rows) 

通知列名輸出

+0

是的,經過更多的研究發現它在數據庫中發生的地方。謝謝回答! – mattLummus

0

將別名包裝在雙引號中可保留區分大小寫。

.select('foo as Bar') # => { bar: true }

.select('foo as "Bar"') # => { Bar: true }

改變爲小寫是不是一個問題,與Rails .select()方法,而是由DB執行,在我們的例子PostgreSQL和一個名爲「摺疊」的做法。值得注意的是,雖然PSQL會摺疊成小寫字母,但mySQL會摺疊成大寫字母。

但我認爲它仍然應該包含在Rails的API文檔 ¯\ _(ツ)_ /¯

0

我喜歡你的答案。您看到的行爲是rails默認值。作爲替代方案, 更經典的「rails方式」是使用json序列化庫,如jBuilder。它可以讓你在你的API更大的控制權,但你的問題就容易解決在使用:

json.key_format! camelize: :lower 
json.first_name 'David' 

# => { "firstName": "David" } 

要使用這樣的事情,你會別名的列is_in_playlist格式。

這裏是先從JBuilder中學習的好地方:

http://railscasts.com/episodes/320-jbuilder

很好的教程更JSON序列化:

http://railscasts.com/episodes/409-active-model-serializers

+0

感謝您的建議Shaunak。我唯一擔心的是,我們必須循環遍歷循環才能使用jBuilder解決方案,因爲這些解決方案通過連接表是非常重要的嵌套屬性。使用as_json包含和混疊似乎比IMO更清潔。然而,我沒有看到Rails API中的任何內容,指出這是一個強制執行的約定,我認爲這是一個文檔問題,無論這是SQL決策還是Rails。 – mattLummus