我有一个相当简单的ActiveRecords关联(特别是在Rails 4中):
但就ActiveReocord查询而言,构建查询以返回组织数组的最佳方式是什么,每个组织都有自己的用户ID数组?基本上,我想返回以下数据结构:
#<ActiveRecord::Relation [#<Organization id: 1, name: "org name",.... user_ids: [1,2,3]>, <Organization id: 2...>]>
...或者在JSON中进一步提炼它:
[{id: 1, name: 'org name', ... user_ids: [1,2,3]}, {...}]
其中users
不是Organizations表的一部分,而只是ActiveRecord动态构建的属性。
提前致谢。
编辑:在尝试了一些事情之后,我想出了一些以我正在寻找的格式返回结果的东西。但我仍然不确定(也不相信)这是否是最佳查询:
Organization.joins(:users).select("organizations.*, '[#{User.joins(:organization).pluck(:id).join(',')}]' as user_ids").group('organizations.id')
或者,JBuilder / Rabl方法@ Kien Thanh建议看起来非常合理和平易近人。对于基于Rails的API开发而言,这被认为是当前最佳实践(该应用程序的后端和前端部分完全解耦)?
答案 0 :(得分:1)
使用JBuilder
或Rabl
等库解决方案唯一需要注意的是在构建json时观察性能。
至于您的查询,请使用includes
代替joins
来提取数据。
orgs = Organization.includes(:users)
您不必以这种方式对结果进行分组(除非该组是针对某些聚合值的)。
ActiveRecord::Relation
为您提供了一些自动辅助方法,其中一种是association_ids
。
因此,如果您从哈希中创建自己的JSON,那么
orgs.map! {|o| o.attributes.merge(user_ids: o.user_ids).to_json }
编辑:忘记添加has_many
http://guides.rubyonrails.org/association_basics.html#has-many-association-reference