Hi all, I am having a weird problem reading a value from my model. basicaly, I have these two models: class Category < ActiveRecord::Base acts_as_tree :order => "name" belongs_to :item_type has_many :specific_category_names end and class SpecificCategoryName < ActiveRecord::Base set_table_name "Specific_category_names" has_many :products belongs_to :brand belongs_to :category #if there is no name, use the name of the category def name if @name.nil? category.name else @name end end end Then, I start to play in the console... In my DB, specific_category_names.name for canon is = "WIDER" and the corresponding category.name = "wide">>canon = Brand.find_by_name("Canon")=>#<Brand:0x2429784 @attributes={"name"=>"Canon", "id"=>"1"}> Thats OK>>canon.specific_category_names.first=>#<SpecificCategoryName:0x24235a0 @attributes={"name"=>"WIDER", "brand_id"=>"1", "id"=>"1", "description"=>nil, "category_id"=>"7"}> then the strange things:>> canon.specific_category_names.first.name=> "Wide" This should be "WIDER" since that the value from specific_category_name and it is not null!!! And even weirder, if I ask again for the specific_category_name array, I will get the same one as before but this time there is a @category added...>> canon.specific_category_names.first=> #<SpecificCategoryName:0x24235a0 @attributes={"name"=>"WIDER", "brand_id"=>"1", "id"=>"1", "description"=>nil, "category_id"=>"7"}, @category=#<Category:0x241557c @attributes={"name"=>"Wide", "id"=>"7", "description"=>nil, "item_type_id"=>"1", "parent_id"=>"2"}>> Anyone can tell me what I am doing wrong?!? This is puzzling me to no end! Thanks -- Posted via http://www.ruby-forum.com/.
"Alain Pilon" <mantat@videotron.ca> wrote in message news:6cf85b3b19dbca955acfe62c2add9d0d@ruby-forum.com...> Hi all, > > I am having a weird problem reading a value from my model. basicaly, I > have these two models: > #if there is no name, use the name of the category> def name > if @name.nil? > category.name > else > @name > end > end > endActiveRecord attributes aren''t stored as instance variables in the model so you don''t need the @. I''m pretty sure AR uses method_missing to return attribute values, try something like this: def name tmp = super return tmp || category.name end
I think (ie untested) you should be able to use def name self[:name] || category.name end See "Overwriting default accessors" in http://api.rubyonrails.com/classes/ActiveRecord/Base.html Chris On 7/19/06, Alan Bullock <liststuff@gmail.com> wrote:> "Alain Pilon" <mantat@videotron.ca> wrote in > message news:6cf85b3b19dbca955acfe62c2add9d0d@ruby-forum.com... > > Hi all, > > > > I am having a weird problem reading a value from my model. basicaly, I > > have these two models: > > #if there is no name, use the name of the category > > > def name > > if @name.nil? > > category.name > > else > > @name > > end > > end > > end > > ActiveRecord attributes aren''t stored as instance variables in the model so > you don''t need the @. I''m pretty sure AR uses method_missing to return > attribute values, try something like this: > > def name > tmp = super > return tmp || category.name > end > > > > > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails >
Thx Chris, that solved my problem. But why use self[:name] and not self.name ??? -- Posted via http://www.ruby-forum.com/.
self[:name] is essentially the rails equivalent of @name. if you tried to use self.name, you would invoke the name method on the current instance, from within... the name method on the current instance; resulting in an infinite loop On 7/20/06, Alain Pilon <mantat@videotron.ca> wrote:> Thx Chris, that solved my problem. But why use self[:name] and not > self.name ??? > > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails >
On 7/20/06, Chris Roos <chrisjroos@gmail.com> wrote:> self[:name] is essentially the rails equivalent of @name.In ruby, this isn''t necessarily true, as @name, self[:name] and self.name can all be different: irb(main):001:0> class A irb(main):002:1> def initialize irb(main):003:2> super irb(main):004:2> @p = 2 irb(main):005:2> end irb(main):006:1> def [] y irb(main):007:2> @x ||= {} irb(main):008:2> @x[y] irb(main):009:2> end irb(main):010:1> def p irb(main):011:2> 1 irb(main):012:2> end irb(main):013:1> def test irb(main):014:2> puts "@p = #{@p}" irb(main):015:2> puts "self.p = #{self.p}" irb(main):016:2> puts "self[:p] = #{self[:p]}" irb(main):017:2> end irb(main):018:1> def self.test irb(main):019:2> new.test irb(main):020:2> end irb(main):021:1> end => nil irb(main):022:0> A.test @p = 2 self.p = 1 self[:p] => nil For ActiveRecord objects, self[:blah] and self.blah are usually the same if blah is a column in the associated table (since self.blah will default to self[:blah]), but that can be (and often is) changed. However, ActiveRecord doesn''t create @blah instance variables for columns, AFAIK. Jeremy