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

相关问题