Martin DeMello
2006-Jan-22 01:11 UTC
[Rails] acts_as_taggable: weird SQL problem with untagging
Setup as follows: class Resource < ActiveRecord::Base belongs_to :user validates_presence_of :filename validates_uniqueness_of :filename, :scope => "user_id", :message => "already exists, try uploading another file or deleting first." acts_as_taggable :join_class_name => ''TagResource'' --------------------------------------------------------------------------------------------------- class TagResource belongs_to :user end --------------------------------------------------------------------------------------------------- And I''m trying to remove a tag from all files belonging to the current user: def delete_tag tag = @params[:tag] affected = Resource.find_tagged_with({ :any => tag, :conditions => "tags_resources.user_id = #{session[:user].id}" }) affected.each {|res| a = res.tag_names - [tag] a = ["untagged"] if a.empty? res.tag a, :clear => true, :attributes => { :user_id => @session[:user].id } } redirect_to :action => ''list'' end --------------------------------------------------------------------------------------------------- which generates the following error: SQLite3::SQLException: tags_resources.resource_id may not be NULL: UPDATE tags_resources SET resource_id = NULL WHERE (resource_id = 7 AND id IN (9)) --------------------------------------------------------------------------------------------------- I''m totally at a loss here - why is the generated SQL setting resource_id = NULL in the first place?! martin
Martin DeMello
2006-Jan-22 01:36 UTC
[Rails] Re: acts_as_taggable: weird SQL problem with untagging
On 1/22/06, Martin DeMello <martindemello@gmail.com> wrote:> Setup as follows:Oops - and the table structure: CREATE TABLE ''tags'' ( ''id'' INTEGER PRIMARY KEY NOT NULL, ''name'' VARCHAR(80) DEFAULT NULL ); CREATE TABLE ''tags_resources'' ( ''id'' INTEGER PRIMARY KEY NOT NULL, ''tag_id'' INTEGER NOT NULL, ''resource_id'' INTEGER NOT NULL, ''user_id'' INTEGER NOT NULL );
Martin DeMello
2006-Jan-22 18:46 UTC
[Rails] Re: acts_as_taggable: weird SQL problem with untagging
Anyone? This has me totally stumped, and I can''t even tell if it''s a problem with acts_as_taggable or with my code. Here''s the stack trace: as far as I can tell, it should simply be doing a DELETE FROM tags_resources WHERE id in (7,8) - there should never be any occasion to modify a record in the join table when untagging a resource. ------------------------------------------------------------------------------------------------ ActiveRecord::StatementInvalid in Tagedit#delete_tag SQLite3::SQLException: tags_resources.resource_id may not be NULL: UPDATE tags_resources SET resource_id = NULL WHERE (resource_id = 6 AND id IN (7,8)) RAILS_ROOT: config/.. Application Trace | Framework Trace | Full Trace /usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/connection_adapters/abstract_adapter.rb:88:in `log'' /usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/connection_adapters/sqlite_adapter.rb:133:in `execute'' /usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/connection_adapters/sqlite_adapter.rb:137:in `update'' /usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/base.rb:486:in `update_all'' /usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/associations/has_many_association.rb:154:in `delete_records'' /usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/associations/association_collection.rb:52:in `delete'' /usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/connection_adapters/abstract/database_statements.rb:51:in `transaction'' /usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/transactions.rb:91:in `transaction'' /usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/transactions.rb:118:in `transaction'' /usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/associations/association_collection.rb:50:in `delete'' /usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/associations/association_collection.rb:39:in `delete_all'' /usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/associations/association_collection.rb:66:in `clear'' /usr/lib/ruby/gems/1.8/gems/acts_as_taggable-1.0.4/lib/taggable.rb:385:in `tag'' ./config/../app/controllers/tagedit_controller.rb:24:in `delete_tag'' ./config/../app/controllers/tagedit_controller.rb:21:in `delete_tag''