【发布时间】:2023-04-03 19:07:01
【问题描述】:
我有一个骨架类:
class Foo
def bar
# returns some sort of array
end
end
但是如何将 'writer' 方法添加到 'bar' 以启用 Array#push 行为?
Foo.new.bar<<['Smile']
_.bar #=> ['Smile']
编辑: 我应该进一步扩展我的问题。 有两个班。 Foo 和 Bar,很像 ActiveRecord has_many 关系,其中 Foo has_many Bars
但我实际上将 Bar 的 id 存储在 Foo 的方法中。我将该方法命名为 bar_ids
所以@foo = Foo.new(:bar_ids => [1,2,3])
如你所想,如果我想查看哪些 Bars 属于 @foo,我实际上必须执行类似 Bar.where(:id => @foo.bar_ids) 之类的操作
所以我决定创建另一个名为 bar 的方法来做到这一点 Foo 类 #... 定义栏 Bar.where(:id => bar_ids) 结尾 结束
成功了。现在我可以做@foo.bar #=> 所有属于@foo 的酒吧
现在我也想拥有像 ActiveRecord 关联这样的推送方法,只是为了在将另一个 bar 对象关联到 foo 对象时去掉“id”输入
目前,这有效: @foo.bar_ids
但我想要: @foo.bar
感谢您的所有帮助,非常感谢您对此的想法!
【问题讨论】:
-
您对 bar 方法有什么期望?它应该只作为 Array 对象的 getter 吗?
-
@David 完全正确。我想要实现的就像 ActiveRecord has_many 关系,您可以在其中执行 @project.line_items
-
@Nik,
@project.line_items << ...返回Array,而不是@project。Foo.new.bar不可能返回一个可以同时调用<<和Foo对象的数组! -
您确定只支持
<<吗?如果有人执行 @foo.bar.insert(position, 'Smile') 会发生什么? -
你知道,这是一个很好的观点。虽然这个特定阵列的位置幸运的是并不重要,但它确实让我们看到了未来可能带来麻烦的不可预见的需求。
标签: ruby