gpt4 book ai didi

ruby-on-rails - 在列出关联对象中的方法检索的对象时避免 N+1 的最佳实践

转载 作者:行者123 更新时间:2023-11-29 12:50:05 25 4
gpt4 key购买 nike

我正在尝试找出解决 Rails 应用程序中 N+1 问题的最佳方法。

假设我有一个模型Student,它有许多 术语 关联。

student = Student.find_by_name('John')
student.terms
# [{term: 1}, {term: 2}, {term: 3}]

因此,我需要能够显示学生学期列表,但还需要在同一 View 中显示上一学期。目前,为此,我有一个方法可以通过属性 start_at 获取上一个学期,该属性是一个 DateTime 值,相当于学期的第一天。

# Term.rb
def previous_term
Term.where("start_at < ?", start_at).order(start_at: :desc).first&.start_at
end

但是在术语列表中使用此方法会查询每个学生的每个术语

- @terms.each do |term|
%td= term.start_at # list current term start_at
%td= term.previous_term # show previous term start_at - N+1 is here

我考虑过在 Controller 中加载所有学生术语并在模型术语中创建一个类方法,该方法将从术语的有序集合中检测前一个术语。

# Term.rb
def self.get_previous(term_collection, term_id)
term_collection.detect do |term|
# logic to filter and get the previous term
end
end

这样它会过滤内存中的对象而不是建立数据库连接,但是我知道有更好更聪明的方法来做到这一点(也许是最佳实践?)。

最佳答案

根据您订购的术语 student.terms.order(start_at: :desc),您可以在 View 中创建一个 ruby​​ 数组loop with index

- @terms.each_with_index do |term, index|
%td= term.start_at
- if index > 0
%td= @terms[0..index-1].pluck(:name)

希望对你有帮助

关于ruby-on-rails - 在列出关联对象中的方法检索的对象时避免 N+1 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56402548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com