gpt4 book ai didi

ruby-on-rails - 混合 acts_as_tree(祖先 gem)、acts_as_list 和默认模型范围

转载 作者:数据小太阳 更新时间:2023-10-29 07:38:43 27 4
gpt4 key购买 nike

我正在使用 ancestry gem在树中构建一些组。同时,我使用 acts_as_list 将组保持在排序列表中的同一树级别。给定以下模型:

class Group < ActiveRecord::Base
acts_as_tree
acts_as_list :scope => "ancestry"

named_scope :parentable, :conditions => "NOT type = 'PriceGroup'"
named_scope :without, lambda { |ids| { :conditions => ['id NOT IN (?)', ids] }}

default_scope :order => "groups.position ASC, groups.name ASC"
end

这非常符合预期,例如,我使用 @group.path 在管理界面的顶部生成面包屑导航。生成的 SQL 没问题,面包屑按树深度排序。至少对于开发环境来说是这样。

在生产中它看起来完全不同:跟踪生成的 SQL 我发现不是祖先的 path 正在生成结果顺序,而是我的 default_scope 接管了。

所以我修复了我的模型,通过覆盖 path 来忽略默认范围:

# remove default scope to not change path sorting
def path
self.class.send :with_exclusive_scope do
super
end
end

但是虽然这在开发中从我的 default_scope 中删除了位置范围,但在生产中它仍然被完全忽略。在生产环境中跟踪 SQL,我没有看到祖先的深度排序,而是从我的 default_scope 中看到的位置排序。

更新:由于我最初“修补”path 方法的想法有点愚蠢(敲敲:它不是继承的,它是动态定义的),我尝试了以下仍然无济于事:

# remove default scope to not change path sorting
def path_with_exclusive_scope
self.class.send :with_exclusive_scope do
path_without_exclusive_scope
end
end
alias_method_chain :path, :exclusive_scope

在开发中调用path时生成的SQL如下:

SELECT *
FROM "groups"
WHERE ("groups"."id" IN (5,64))
ORDER BY (case when ancestry is null then 0 else 1 end), ancestry

与生产环境中生成的 SQL 相比:

SELECT *
FROM `groups`
WHERE (`groups`.`id` IN (8,49))
ORDER BY groups.position ASC, groups.name ASC

开发使用 SQLite 而生产使用 MySQL - 但我认为这不是这里的关键区别。

最佳答案

acts_as_list 有一些 bugs在处理 default_scope 时。您应该避免使用它或在 GitHub 上寻找固定版本。尝试 this version (您可以在我之前链接的拉取请求中找到相关提交的链接)

关于ruby-on-rails - 混合 acts_as_tree(祖先 gem)、acts_as_list 和默认模型范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2396875/

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