带有 has_many belongs_to 关联的 Rails activerecord 查询

Posted

技术标签:

【中文标题】带有 has_many belongs_to 关联的 Rails activerecord 查询【英文标题】:Rails activerecord query with has_many belongs_to association 【发布时间】:2016-03-11 10:37:08 【问题描述】:

我有两个 ActiveRecord 模型:UserCourse。关联如下:

class User < ActiveRecord::Base
  has_many :courses
end

class Course < ActiveRecord::Base
  belongs_to :user
end

现在我的问题是:如何获取每个用户的最后一门课程?

我尝试了以下操作:

courses = Array.new
User.find_each  |u| courses << u.courses.last 

但我怀疑它的性能。因此,寻找具有良好性能的最佳解决方案。

提前致谢。

【问题讨论】:

我猜你需要一个 SQL 查询来一次获取所有用户的最后一门课程。我说得对吗@Ganesh 是的,我需要一个 SQL 查询。 @illusionist 您可以使用连接和原始 SQL 的东西来解决这个问题,但我无法使用 activerecord 方法解决它。我认为使用include 并接受总共 2 个 sql 查询是最好的解决方案,因为它比 SQL 方式简单。 @Albin 你能给我提示吗? 嗯,你的问题解决了吗? 【参考方案1】:

我仍然认为只接受 2 个查询可能更容易。但是我在决定在 2 个查询中做之前找到了我看过的文章。这可行,但它增加了相当多的复杂性。

Rails Associations has_one Latest Record

【讨论】:

【参考方案2】:

在 2 个请求中:

User.select(:id).includes(:courses).each  |u| u.courses.last 

如果您的表太大,则不起作用

【讨论】:

【参考方案3】:

另一种使用 1 个 SQL 查询的方式

Course.all.group_by(&:user_id).map  |_k,courses| courses.last 

【讨论】:

这绝对不是预期的行为。【参考方案4】:

要获取每个用户的最后一门课程,您可以这样做:

courses = []
User.includes(:courses).find_each  |u| courses << u.courses.last 

【讨论】:

他说他需要一个 SQL 查询,如果可能的话【参考方案5】:

这样你就可以找到用户的最后一门课程

User.find(1).courses.order(name: :ASC).last

如果你想要一个数组:

courses = []

User.each do |u|
   courses << u.courses.order(name: :ASC).last
end

【讨论】:

以上是关于带有 has_many belongs_to 关联的 Rails activerecord 查询的主要内容,如果未能解决你的问题,请参考以下文章

Rails Searchkick / Elasticsearch has_many 和 belongs_to 关联

包括与条件的左连接 has_many 关联

thinkphp一对多HAS_MANY

Rails 中的 has_many 关联迁移

Ruby on Rails:用户模型关联应用程序和迁移

如何在父应用程序模型和挂载引擎模型之间设置has_many关联?