I'm not sure which model is causing the problem. I am now trapping exceptions and the error first occurs when I execute root.save (see ***1***). 'root' is an instance of my Property model. I also get the same error when executing code *** 2 *** (which follows the execution of *** 1 ***) - member.save forces another (different) instance of Property to be saved to the properties table which again triggers the same error. FYI 'member.create_default_characteristics(user)' (in *** 2 ***) calls create_root() (*** 1 ***). The log file also suggests that both errors are raised on an INSERT into my properties table.
*** 1 *** def create_root(administrator) begin root = create_root_collection(self.pingee_name, administrator, GlobalAccessibility.new, OwnerAccessibility.new) root.save rescue Exception => exe logger.info("*** Member.create_root #{exe} #{root.name.to_s} ***") end self.root = root end *** 2 *** def self.add_member_for_user(user) member = new(:user_id => user.id, :pingee_name => user.pingee_name) # Create the member's default characteristics and save it all to the database in a single # transaction begin transaction do member.create_default_characteristics(user) member.save! end member rescue Exception => exe logger.info("*** Member.add_member_for_user #{exe} ***") end end On 23 Dec, 15:19, Frederick Cheung <frederick.che...@gmail.com> wrote: > On 23 Dec 2008, at 14:04, lee.longm...@googlemail.com wrote: > > > > > I have checked for method/association name clashes and can't see any. > > Any tips on how I might debug this further would be very much > > appreciated - I am completely stuck! > > You could start by showing the code in your model. If you've got any > plugins you're using it's worth making sure they aren't the problem > > Fred > > > > > To recap, I am getting the error "undefined method `each' for > > true:TrueClass" when an Active Record method (in active_record/base.rb > > - see below) is being executed. So I assume 'attribute_names' is being > > set to true for some reason. > > > # Returns a copy of the attributes hash where all the values > > have been safely quoted for use in > > # an SQL statement. > > def attributes_with_quotes(include_primary_key = true, > > include_readonly_attributes = true, attribute_names = > > @attributes.keys) > > quoted = {} > > connection = self.class.connection > > attribute_names.each do |name| > > if (column = column_for_attribute(name)) && > > (include_primary_key || !column.primary) > > value = read_attribute(name) > > > # We need explicit to_yaml because quote() does not > > properly convert Time/Date fields to YAML. > > if value && self.class.serialized_attributes.has_key? > > (name) && (value.acts_like?(:date) || value.acts_like?(:time)) > > value = value.to_yaml > > end > > > quoted[name] = connection.quote(value, column) > > end > > end > > include_readonly_attributes ? quoted : > > remove_readonly_attributes(quoted) > > end > > > On 20 Dec, 14:26, Frederick Cheung <frederick.che...@gmail.com> wrote: > >> On Dec 20, 1:52 pm, > >> "lee.longm...@googlemail.com"<lee.longm...@googlemail.com> wrote: > >>> To add, I am seeing the following when I retrieve an existing Root > >>> object in the Rails console and then try to save it again: > > >> My guess would be that you have a method or an association with a > >> name > >> that has since been used internally by activerecord. If you can show > >> more of your model someone might be able to spot the troublemaker. > > >> Fred > > >>> => #<Root id: 1, type: "Root", name: "Base of Administrator", > >>> yaml_container: nil, parent_id: nil, owner_id: 1, custodian_id: 1, > >>> property_control_id: 1, include_parent_responses: false, > >>> inheritable: > >>> false, response_vehicle_id: nil, acquire_child_values: false, > >>> description: nil, rating: nil, link_base_id: nil, base_image_id: > >>> nil, > >>> event_when_id: nil, event_description_id: nil>>> root.save > > >>> NoMethodError: undefined method `each' for true:TrueClass > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> base.rb:2808:in `attributes_with_quotes' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> base.rb:2706:in `update_without_lock' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> locking/optimistic.rb:70:in `update_without_dirty' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> dirty.rb:146:in `update_without_callbacks' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> callbacks.rb:253:in `update_without_timestamps' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> timestamp.rb:38:in `update' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> base.rb:2699:in `create_or_update_without_callbacks' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> callbacks.rb:222:in `create_or_update' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> base.rb:2383:in `save_without_validation' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> validations.rb:1009:in `save_without_dirty' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> dirty.rb:79:in `save_without_transactions' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> transactions.rb:179:in `send' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> transactions.rb:179:in `with_transaction_returning_status' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> connection_adapters/abstract/database_statements.rb:66:in > >>> `transaction' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> transactions.rb:129:in `transaction' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> transactions.rb:138:in `transaction' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> transactions.rb:178:in `with_transaction_returning_status' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> transactions.rb:146:in `save' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> transactions.rb:158:in `rollback_active_record_state!' > >>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ > >>> active_record/ > >>> transactions.rb:146:in `save' > > >>> Any thoughts much appreciated. > > >>> On 20 Dec, 06:54, "lee.longm...@googlemail.com" > > >>> <lee.longm...@googlemail.com> wrote: > >>>> I have been working through an upgrade of my 1.2.6 application to > >>>> 2.2.2. > > >>>> I am almost there but I have hit a problem with ActiveRecord. > > >>>> Before the upgrade, the following code was working fine. > > >>>> def create_root(administrator) > >>>> root = create_root_collection(self.pingee_name, > >>>> administrator, > >>>> GlobalAccessibility.new, > >>>> OwnerAccessibility.new) > >>>> root.save > >>>> self.root = root > >>>> end > > >>>> But now I get am getting an exception "undefined method `each' for > >>>> true:TrueClass" when root.save is executed. > > >>>> fyi, the "create_root_collection" method creates a "root" object > >>>> and > >>>> assigns new object to its "belongs to" association. > > >>>> I have traced it through carefully and it is definitely failing > >>>> when > >>>> trying to save the "root" object itself. > > >>>> Given the error message, and the fact that the root object contains > >>>> boolean columns, I wonder if the problem is to do with the saving > >>>> boolean values. I am using MySQL and declaring the boolean > >>>> columns in > >>>> the following way (using raw SQL not migrations currently): > > >>>> include_parent_responses boolean default false not null, > > >>>> Is the "boolean" column type still valid? > > >>>> Thanks! --~--~---------~--~----~------------~-------~--~----~ 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@googlegroups.com To unsubscribe from this group, send email to rubyonrails-talk+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---