带有 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 模型:User 和 Course。关联如下:
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 查询的主要内容,如果未能解决你的问题,请参考以下文章