为什么 Rails .select 别名将属性更改为小写?

Why does Rails .select alias change attributes to lowercase?

在我们的控制器中,我们正在尝试显示一个视频系列,它应该 return JSON 类似于:

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

我们正在通过另一个 table 添加 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 值。但是,当我们执行此查询时,这些属性改为 returned 小写:

{
  isinplaylist: true,
  isfavorite:   false
}

将别名用双引号引起来可以保持区分大小写。

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

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

更改为小写不是 Rails .select() 方法的问题,而是由数据库强制执行,在我们的例子中是 PostgreSQL,并且是一种称为 "Folding" 的做法。值得注意的是,虽然 PSQL 会折叠成小写字母,但 mySQL 会折叠成大写字母。

不过我认为它仍应包含在 Rails API 文档中 ¯\_(ツ)_/¯

我喜欢你的回答。您看到的行为是 rails 默认值。作为替代和 更经典的 'rails way' 是使用像 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 序列化程序的好教程:

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

这不是 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)

注意列名输出