我有一个相当简单的ActiveRecords关联,比如(特别是在Rails4中):
- 一个组织有许多用户
- 用户属于某个组织
但就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]}, {...}]
其中CCD_ 1不是Organizations表的一部分,而只是ActiveRecord动态构建的属性。
提前谢谢。
编辑:在尝试了一些东西之后,我想出了一些东西,以我想要的格式返回结果。但我仍然不确定(也不相信)这是否是最理想的查询:
Organization.joins(:users).select("organizations.*, '[#{User.joins(:organization).pluck(:id).join(',')}]' as user_ids").group('organizations.id')
或者,Kien Thanh建议的JBuilder/Rabl方法似乎非常合理和可行。这被认为是目前基于Rails的API开发的最佳实践吗(该应用程序的后端和前端部分完全不耦合)?
对于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-许多关联引用