复杂的活跃记录协会

时间:2012-06-23 12:04:52

标签: ruby-on-rails ruby-on-rails-3

User
  first_name: "Johnny"
  age: 15

Car
  name: "Mazda"

Car
  name: "BMW"

我希望结果看起来像

[ {"first_name": "Johnny", "age": 15, cars: [ { "name": "Mazda" }, { "name" : "BMW" } ] } ]

是否可以在Rails中执行此操作?到目前为止,我可以通过输入johnny.cars来获取用户汽车,但我希望数据结构也能保存parent的值。

我正在玩弄使用named_scopes和瞬态属性的想法但到目前为止没有运气,我们非常感谢任何想法/帮助。

1 个答案:

答案 0 :(得分:2)

您实际上可以使用:includes语句

从另一个表中检索所有记录

includes是一种神奇的语法,您可以在其中急切加载记录的所有关联记录。

示例在您的情况下

用户has_many汽车

所以如果你这样做

@users = User.includes(:cars)

现在这将加载所有用户记录,并将为每个用户对象加载所有汽车记录

所以如果你遍历用户对象并执行

<% @users.each do |user| %>
  <%= user.cars %>
<%end%>

user.cars不会触发单独的查询来获取用户的所有汽车,而是使用includes子句获取那些急切加载的记录

此技术广泛用于避免N+1查询问题

谷歌让N+1了解更多信息

希望这个帮助