【发布时间】:2026-01-24 09:05:03
【问题描述】:
一直在使用 Rails,但现在我完全没有框架编码,我错过了很多我自己无法编写的方法。所以我需要一点提示。
所以我有这个代码
class Foo
initialize(k)
(1..k).each do |b|
Boo.new(b)
end
end
class Boo
initialize(a)
@a = a
end
end
Foo.new(10)
#and now I want to access one of the Boo's with a certain a (in Rails Boo.find_by_a(2) e.g.)
如何编写一个使用特定值“a”的方法,以通过 @a = a 获取特定的 Boo?
更新:
好的,我在 Boo 中添加了这个方法
def self.all
ObjectSpace.each_object(self).to_a
end
现在我得到了正确的对象:
boo = Boo.all.select{ |b| b.a == 2 }.first
但如果我想让它成为一种方法,我会把它放在哪里?
【问题讨论】:
-
你没有在任何地方捕获这些。现在您正在创建 10 个嘘声,但它们没有被存储,并且会很快被 GC 拾取。一般规则先学习 Ruby,然后再学习 Rails。这将对您非常有益,并且有大量的资源。
-
我已经编写了一个
all方法,它可以将所有对象返回到一个数组中。只是现在不知道如何挑选合适的。 -
您的代码没有显示任何内容,并且格式错误。请向我们展示您的实际代码,或者至少先修复这里的代码。
-
我刚刚阅读了您的更新,您似乎误解了 PORO 与 ActiveRecord 对象。
Boo.find_by_xxx不会做你想做的,因为这依赖于 AR 和 SQL。你在这里最好的实现方法是 Foo 的实例方法。 -
面向对象的设计是关于责任的。需要有人负责持有和维护对您的嘘声的访问。也许是 Foo,也许是 Boo 类,也许是其他类,甚至是全局变量。这取决于你的问题。滥用 ObjectSpace 是最糟糕的选择。