gpt4 book ai didi

ruby-on-rails - 如何使用带有 rails 的祖先 gem 来急切加载根?

转载 作者:行者123 更新时间:2023-12-04 00:06:45 26 4
gpt4 key购买 nike

我有一个属于类别的条目模型。类别模型使用祖先,以便我可以嵌套类别。

我想按其根类别对所选条目进行分组。我遇到的问题是,为了做到这一点,rails 对每个条目执行查询以获取根类别。因此,如果我有 20 条记录,它将执行 20 个查询以按根类别分组。

我已经通过预先加载类别(如下所示)减少了查询数量,但我不知道如何预先加载类别的根。

这是我正在使用的代码:

Controller

@entries = current_user.entries.includes(:category)
@entries_by_category = @entries.group_by { |entry| entry.category.root }

entry.rb
class Entry < ActiveRecord::Base
belongs_to :category
end

category.rb
class Category < ActiveRecord::Base
has_ancestry

has_many :entries
end

我试过在类别模型上放置一个默认范围,如下所示: default_scope { includes(:ancestry) } .但这并没有改变执行查询的数量。我不知道如何使用 includes()在原始查询上包含类别和类别的根。

作为一些额外的信息,类别只能嵌套 2 层深(仅类别和子类别)。所以 root 在技术上意味着父级,它不必遍历多个级别。

有任何想法吗?

最佳答案

我有一个非常相似的问题,只是我想急切地加载类别的 path而不仅仅是 root .不幸的是,预先加载仅适用于关联。 Ancestry 导航器( parentrootpathancestors 等)都是方法,而不是关联,因此您不能急切加载它们。

我的解决方案是预先加载条目的类别关联,然后在 Category 上使用模型级缓存(参见 Railscast #115)。缓存 path (在您的情况下,您可以修改为 root):

category.rb

def cached_path
Rails.cache.fetch([self, "path"]) { path.to_a }
end

entry_controller.rb
def index
@entries = Entry.includes(:category)
end

View /条目/index.html.haml
- @entries.each do |entry|
= entry.category.cached_path.map{ |c| c.name }.join(" / ")

希望有帮助。

关于ruby-on-rails - 如何使用带有 rails 的祖先 gem 来急切加载根?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21948460/

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