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

时间:2016-08-03 18:23:46

标签: sql ruby-on-rails postgresql ruby-on-rails-4 rails-postgresql

在我们的控制器中,我们正在尝试显示一个视频系列,它应该返回与此类似的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
}

3 个答案:

答案 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序列化器的好教程:

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