gpt4 book ai didi

ruby - 事件记录范围 : Strange behaviour with select on relation

转载 作者:太空宇宙 更新时间:2023-11-03 18:23:55 24 4
gpt4 key购买 nike

我有两个具有 1:N 关系的不同模型。让我们将它们命名为“myobject”和“related”

class Myobject < ActiveRecord::Base
has_many :related
scope :without_related, includes(:related).select{ |o| o.related.size == 0 }
end
class Related < ActiveRecord::Base
end

只要我不创建从 Myobjects 到 Related 的新分配,定义的范围似乎就可以很好地工作:

  • Direct rails c 命令“Myobject.includes(:related).select ...(如范围中定义的)按预期工作
  • 对范围“Myobject.without_related”的调用仍然返回同时已分配的对象

这似乎可以通过重新启动 Rails 控制台或重新启动 Webrick 来解决。但我不能总是仅仅因为对象之间的关系已更改而重新启动 Web 应用程序 ;)

有什么方法可以解决这个问题或以更好的方式编写作用域吗?

PS:我需要这个查询作为范围,以将其名称作为 group_method 传递给 Myobject 模型形式的 grouped_select

最佳答案

你的问题是实际上你的范围不是范围:)

范围必须返回关系,但您的范围返回数组。

虽然它可以像你期望的那样工作,但如果你用 lambda 包装它

 scope :without_related, lambda{ includes(:related).select{ |o| o.related.size == 0 } }

但我建议像通常的类方法一样重写这段代码,以免误导那些将来会使用这段代码的人

def self.without_related
includes(:related).select{ |o| o.related.size == 0 }
end

或按照其他答案中的建议使用计数器缓存。

关于ruby - 事件记录范围 : Strange behaviour with select on relation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13938348/

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