【问题标题】:activerecord - how to get all column of joined tablesactiverecord - 如何获取连接表的所有列
【发布时间】:2012-02-27 10:09:59
【问题描述】:

阅读后:this

我还是不明白。在控制台中:

puts Category.joins(:posts)

它对Category和Post执行join或left join。

但是,返回的所有数据只是类别表中的列。如何在 Post 中获取这些列数据。 ?

我应该制作另一个模型来实现这一点吗?

看完后:this find_by_SQL 是唯一的方法吗?如果可能的话,我想要 ActiveRecord 方式。

谢谢。

【问题讨论】:

  • 您应该更具体地说明您要达到的目标。如果你想要它“Active Record 方式”,你甚至不应该谈论“列”,因为你操作的是对象,而不是表。如果你真的需要原始数据,你可以使用ActiveRecord::Base.connection.select_all( 'SELECT...'),这将返回一个哈希数组(没有模型实例化)。 the documentation is here
  • 谢谢,我现在用这种方式:ActiveRecord::Base.connection.select_all(Category.joins(:posts).to_sql)),这种方式是不是太讨厌了?
  • 没问题。但是,如果您真的想以 ORM 方式工作,您应该只将这些技巧用于非常复杂的 SQL 查询。对于这样一个微不足道的问题,我会改用@abhishek 的解决方案+includes。如果您不以 OO 方式编写代码,为什么还要使用 ORM?

标签: ruby-on-rails activerecord


【解决方案1】:

你可以试试 select() 方法:

Category.select("categories.*, posts.*").joins(:posts)

【讨论】:

  • 感谢您的回复。这是行不通的。它仍然只返回 "categories.*" 。尽管生成的 SQL 是“ SELECT categories.*, posts.* from ...
  • 如何检查它是否正常工作?我刚刚测试过,对我来说效果很好。
  • 我在“rails 控制台”中运行此命令。使用 puts 和 ap(awesome print): puts Category.select("categories.*, posts.*").joins(:posts) 它只返回 #<0x0000000528c170>
  • <a href="/default/index/tourl?u=aHR0cDovL2d1aWRlcy5ydWJ5b25yYWlscy5vcmcvYWN0aXZlX3JlY29yZF9xdWVyeWluZy5odG1sI3NlbGVjdGluZy1zcGVjaWZpYy1maWVsZHM%3D" rel="nofollow" target="_blank"></a>
【解决方案2】:

您可以通过进一步查询来获取帖子表中的列,例如 -

Category.joins(:posts).collect{|category| category.posts.map{|post| post.attributes.merge(category.attributes) } }

这将为您提供一个巨大的帖子和类别属性列表,每个类别都合并在一起。

但是在 Category 上进行连接的目的是获得一组具有某些遵循特定连接条件的类别。如果我们以同一指南中的下一个示例为例,

Post.joins(:category, :comments)

这也为您提供了一个仅包含帖子的列表,但该列表仅包含遵循连接约束的帖子,也就是说,它们都有一个类别和一条评论。

【讨论】:

  • 请注意,collect 可能会导致 N+1 查询问题。为避免这种情况,请使用includes。见the RoR guides on eager loading
  • 如果帖子有多个类别和/或多个评论,Post.joins(:category, :cmets) 不会多次返回帖子吗?
猜你喜欢
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
相关资源
最近更新 更多