为什么 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 序列化程序的好教程:
这不是 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)
注意列名输出
在我们的控制器中,我们正在尝试显示一个视频系列,它应该 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 序列化程序的好教程:
这不是 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)
注意列名输出