Rails Active Records具有自己的属性+关联对象'标识

时间:2014-10-22 23:09:49

标签: activerecord ruby-on-rails-4 model-associations

我有一个相当简单的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开发而言,这被认为是当前最佳实践(该应用程序的后端和前端部分完全解耦)?

1 个答案:

答案 0 :(得分:1)

使用JBuilderRabl等库解决方案唯一需要注意的是在构建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

的参考
相关问题