【问题标题】:Rails activerecord query with has_many belongs_to association带有 has_many belongs_to 关联的 Rails activerecord 查询
【发布时间】: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 你能给我提示吗?
  • 嗯,你的问题解决了吗?

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


【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多