I am trying to access a model''s attribute that does not have a column in the model''s corresponding table. It exists only through an attr_accessor: class Widget < ActiveRecord::Base attr_accessor :attribute_not_in_db end I can access the attribute directly:>> w = Widget.new(:attribute_not_in_db => "foo") >> w.attribute_not_in_db=> "foo" However, I can''t seem to access it other ways:>> attr_symbol = :attribute_not_in_db >> w[attr_symbol]=> nil>> attr_name = "attribute_not_in_db" >> w[attr_name]=> nil>> w.read_attribute(attr_symbol)=> nil>> w.read_attribute(attr_name)=> nil This is probably rather basic, but my searching hasn''t turned up the answer. Any guidance would be apprecited. thx. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
One way to dynamically add attributes to some model object on the fly is to just directly add the new key(s)/val(s) to the model instance''s attributes: $ ./script/console Loading development environment (Rails 2.2.2)>> test = Test.find(:first)=> #<Test id: 1, name: "Abe">>> test.attributes.keys=> ["id", "name"]>> test["favorite_color"] = ''blue''=> "blue">> test.attributes.keys=> ["id", "favorite_color", "name"]>> test.favorite_color=> "blue" Another way, assuming the purpose is to add additional attribs coming from a db qry, ... Note that any additional attribs returned from a db query will be automatically added to the returned model ob(s):>> test2 = Test.find_by_sql("select *, ''blue'' as favorite_color from tests order by id limit 1").first=> #<Test id: 1, name: "Abe">>> test2.attributes.keys=> ["id", "favorite_color", "name"]>> test2.favorite_color=> "blue" Note that neither of the above requires any accessor-related code in your model ob (unless you want/need it for other purposes): $ cat app/models/test.rb class Test < ActiveRecord::Base end Jeff On Feb 15, 3:54 pm, rapdup <nat...-0Jc3Nyk0cKRAfugRpC6u6w@public.gmane.org> wrote:> I am trying to access a model''s attribute that does not have a column > in the model''s corresponding table. It exists only through an > attr_accessor: > > class Widget < ActiveRecord::Base > attr_accessor :attribute_not_in_db > end > > I can access the attribute directly: > > >> w = Widget.new(:attribute_not_in_db => "foo") > >> w.attribute_not_in_db > > => "foo" > > However, I can''t seem to access it other ways: > > >> attr_symbol = :attribute_not_in_db > >> w[attr_symbol] > > => nil > > >> attr_name = "attribute_not_in_db" > >> w[attr_name] > > => nil > > >> w.read_attribute(attr_symbol) > > => nil > > >> w.read_attribute(attr_name) > > => nil > > This is probably rather basic, but my searching hasn''t turned up the > answer. Any guidance would be apprecited. > > thx.--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Thanks for the response. I''m afraid my initial post wasn''t clear as it could be. I am trying to find a specific syntax to access an accessor getter/setter using a variable, in this example "x": user = User.new(:login=> "foo", :password=>"bar") # :password is not a column in the db, but defined in the model using "attr_accessor :password" (see initial post) [:login, :password].each do |x| original_val = user[x] user[x] = some_new_val do_some_test(user) user[x] = original_val end It works for :login which is an actual attribute of User. However, since :password was created as an attribute accessor (def password & def password=), the syntax "user[e]" doesn''t work. I''m looking for a way to make this work while keeping "attr_accessor :password" I hope this is clearer. Thanks for the assist. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Okay, I found a solution. It isn''t very readable, but it works: user = User.new(:login=> "foo", :password=>"bar") # :password is not a column in the db, but defined in the model using "attr_accessor :password" (see initial post) [:login, :password].each do |x| getter = x # => :password setter = (x.to_s << "=").to_sym # => :password original_val = user.method(getter).call user.method(setter).call(some_new_val) do_some_test(user) user.method(setter).call(original_val) end Any clean up suggestion? --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
The reason to add extra attributes as shown in my example is to allow for the accessor goodies provided by ActiveRecord for the model ob: $ cat app/models/hit.rb class Test < ActiveRecord::Base attr_accessor :foo end $ ./script/console Loading development environment (Rails 2.2.2)>> test = Test.new=> #<Test id: nil, name: nil>>> test.id = 987=> 987>> test[:id]=> 987>> test["id"]=> 987>> test.foo = ''bar''=> "bar">> test[:foo]=> nil #huh?>> test["foo"]=> nil #huh?>> test.attributes.keys=> ["id", "name"] #huh? ### add key/val via model ob''s attributes:>> test[''foo''] = ''bar''=> "bar" #cool.>> test.foo=> "bar" #cool.>> test[:foo]=> "bar" #cool.>> test.attributes.keys=> ["id", "foo", "name"] #cool. So, for your User example, if you changed the adding of password attrib as: ... user["password"] = "bar" ... then your orig code should work as you intended. Hope that helps, Jeff On Feb 15, 9:14 pm, rapdup <nat...-0Jc3Nyk0cKRAfugRpC6u6w@public.gmane.org> wrote:> Okay, I found a solution. It isn''t very readable, but it works: > > user = User.new(:login=> "foo", :password=>"bar") # :password is not > a column in the db, but defined in the model using > "attr_accessor :password" (see initial post) > [:login, :password].each do |x| > getter = x # => :password > setter = (x.to_s << "=").to_sym # => :password> original_val = user.method(getter).call > user.method(setter).call(some_new_val) > do_some_test(user) > user.method(setter).call(original_val) > end > > Any clean up suggestion?--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On Feb 16, 12:14 am, rapdup <nat...-0Jc3Nyk0cKRAfugRpC6u6w@public.gmane.org> wrote:> Okay, I found a solution. It isn''t very readable, but it works: > > user = User.new(:login=> "foo", :password=>"bar") # :password is not > a column in the db, but defined in the model using > "attr_accessor :password" (see initial post) > [:login, :password].each do |x| > getter = x # => :password > setter = (x.to_s << "=").to_sym # => :password> original_val = user.method(getter).call > user.method(setter).call(some_new_val) > do_some_test(user) > user.method(setter).call(original_val) > end > > Any clean up suggestion?This is marginally cleaner IMO: [:login, :password].each do |getter| setter = "#{getter}=" original_val = user.send(getter) user.send(setter, some_new_val) do_some_test(user) user.send(setter, original_val) end --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---