我有一个骨架类:
class Foo
def bar
# returns some sort of array
end
end
但是如何将'writer'方法添加到'bar'以便启用Array#push行为?
Foo.new.bar<<['Smile']
_.bar #=> ['Smile']
EDITED: 我应该进一步扩展我的问题。 有两个班。 Foo和Bar,很像ActiveRecord has_many关系,其中Foo has_many Bars
但实际上我将Bar的id存储在Foo的方法中。我将该方法命名为bar_ids
所以@foo = Foo.new(:bar_ids =&gt; [1,2,3])
你可以想象,如果我想查看Bars属于@foo,我必须实际做一些像Bar.where(:id =&gt; @ foo.bar_ids)
所以我决定制作另一个名为bar的方法来做到这一点 Foo级 #... def吧 Bar.where(:id =&gt; bar_ids) 结束 端
结果证明了这一点。现在我可以做@ foo.bar#=&gt;所有属于@foo的栏目
现在我也想拥有像ActiveRecord关联那样的推送方法,只是为了在将另一个bar对象与foo对象关联时删除“id”类型
目前,这有效: @ foo.bar_ids&lt;&lt; Bar.new.id @ foo.save
但我想要: @ foo.bar&lt;&lt; Bar.new #where新条形码的id将被推送到@foo的bar_ids方法中 @ foo.save
感谢您的所有帮助,我非常感谢您对此的看法!
答案 0 :(得分:2)
class Foo
attr_reader :bar
def initialize
@bar = Array.new
def @bar.<< arg
self.push arg.id
end
end
end
class Bar
attr_accessor :id
def initialize id
self.id = id
end
end
f = Foo.new
bars = (1..5).map{|i| Bar.new i}
f.bar << bars[2]
f.bar << bars[4]
p f.bar #=> [3, 5]
答案 1 :(得分:1)
返回定义了<<
方法的对象。
答案 2 :(得分:0)
除非我误解了你想要的东西,为什么不让bar
方法成为内部数组成员的getter?
class Foo
attr_reader :bar
def initialize
@bar = []
end
end
f = Foo.new
f.bar << 'abc'
# f.bar => ['abc']