在我们的控制器中,我们正在尝试显示一个视频系列,它应该返回与此类似的JSON:
{
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语句中,这些属性显式别名为camel-cased值。但是,当我们执行此查询时,这些属性将返回小写:
{
isinplaylist: true,
isfavorite: false
}
答案 0 :(得分: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)
注意列名输出
答案 1 :(得分:0)
用双引号括起别名可以保持区分大小写。
.select('foo as Bar') # => { bar: true }
.select('foo as "Bar"') # => { Bar: true }
对小写的更改不是Rails .select()
方法的问题,而是由DB强制执行,在我们的例子中是PostgreSQL,并且是一种称为“Folding”的实践。值得注意的是,虽然PSQL将折叠为小写字母,但mySQL将折叠为大写字母。
但我认为它应该仍然包含在Rails API文档中 ¯\ _(ツ)_ /¯
答案 2 :(得分:0)
我喜欢你回答。您看到的行为是rails default。作为替代和 更经典的铁路方式'将使用像jBuilder这样的json序列化库。它可以让您更好地控制您的API,但使用以下方法可以轻松解决问题:
json.key_format! camelize: :lower
json.first_name 'David'
# => { "firstName": "David" }
要使用这样的内容,您可以将列别名为is_in_playlist
格式。
这是开始jBuilder学习的好地方:
http://railscasts.com/episodes/320-jbuilder
关于更多json序列化器的好教程: