add class variable to all models using concern to extend AR?

20 views
Skip to first unread message

Matt Yoder

unread,
Nov 20, 2013, 12:34:37 PM11/20/13
to rubyonra...@googlegroups.com
Hi All,

I've previously used concerns to extend my models without problems. I'm
now trying to extend all my models in one swell-foop by extending AR
with a concern. In brief, I want to add a class variable to each
individual model using a concern that extends AR. Specifically - I
need to find the where (and how) to define a class variable scoped to a
specific model in my AR extending concern. Is this sane? Possible?

Thanks,

Matt

--
Posted via http://www.ruby-forum.com/.

Tamara Temple

unread,
Nov 21, 2013, 4:21:27 AM11/21/13
to rubyonra...@googlegroups.com
> —

Maybe? This seems like requiring the children to know a specific implementation detail of a parent class via the concern mixin. Instead, I’d provide accessor methods.

Matt Jones

unread,
Nov 21, 2013, 11:09:41 AM11/21/13
to rubyonra...@googlegroups.com


On Wednesday, 20 November 2013 12:34:37 UTC-5, Ruby-Forum.com User wrote:
Hi All,

I've previously used concerns to extend my models without problems.  I'm
now trying to extend all my models in one swell-foop by extending AR
with a concern. In brief, I want to add a class variable to each
individual model using a concern that extends AR.   Specifically - I
need to find the where (and how) to define a class variable scoped to a
specific model in my AR extending concern. Is this sane?  Possible?


You don't want a class variable for this - they are shared between all the subclasses. A sample IRB trace:

irb: class Foo
>>     end
===> nil
irb: module Bar
>>     def wat=(value)
>>       @@wat = value
>>     end
>>
>>     def wat
>>       @@wat
>>       end
>>   end
===> nil
irb: Foo.send(:include, Bar)
===> Foo
irb: f = Foo.new
===> #<Foo:0x00000100b5a008>
irb: f.wat = 'huh'
===> "huh"
irb: f.wat
===> "huh"
irb: class Baz < Foo
>>     end
===> nil
irb: class Baz2 < Foo
>>     end
===> nil
irb: b = Baz.new
===> #<Baz:0x00000100b7ac68>
irb: b.wat
===> "huh"
irb: b2 = Baz2.new
===> #<Baz2:0x00000100b82580>
irb: b2.wat = 'nope'
===> "nope"
irb: f.wat
===> "nope" 

You likely want a class instance variable instead, to avoid the sharing. More details here:


--Matt Jones

Matt Yoder

unread,
Nov 21, 2013, 11:22:30 AM11/21/13
to rubyonra...@googlegroups.com
Thanks Matt,

Your observations are exactly what I was running into. Good to know I
should focus on class instance variables. Inheritance is a bit of mixed
bag- I want it for all subclasses of my models whose superclass is not
AR::Base.

The link is very helpful, wish I would have seen it earlier. A couple
followups- can you comment on whether some of the approach therein has
been replaced with the use of 'class_attribute'? Also, do you forsee
any issues with using a Concern rather than the extend approach
described there?

At present I've fallen back to just extending individual models (this in
retrospect might be safer in the long run, albeit not as magikal).

Thanks again for your help,
Reply all
Reply to author
Forward
0 new messages