This project is archived and is in readonly mode.

#6078 ✓stale
michalczyz (at gmail)

[BUG] delete_all using wrong database connection when executing on relation

Reported by michalczyz (at gmail) | November 28th, 2010 @ 01:53 PM

Context

Using Rails 3.0.3 and Ruby 1.9.2

In one rails project i'm using multiple database connections (code below) and different adapters (mysql and pq).
Connection to RedMine using Mysql adapter
Connection to main database using PostgreSQL adapter

Problem

When I fetching all specification for project it works fine


ruby-1.9.2-p0 > project.specifications
 => [#<RedMine::SpecificationCache id: 1, project_id: 45, version_id: 71, developer_id: nil, status: "@_todo", estimation: nil, tags: "@mapa @__kb_articles", scenario_title: "Scenario 1", feature_title: "Feature 1", feature_hash_id: nil>, #<RedMine::SpecificationCache id: 3, project_id: 45, version_id: 71, developer_id: nil, status: "@_backlog", estimation: nil, tags: "@map @__kb_articles", scenario_title: "Scenario 1", feature_title: "Feature 2", feature_hash_id: nil>, #<RedMine::SpecificationCache id: 4, project_id: 45, version_id: 71, developer_id: 0, status: "@_done", estimation: nil, tags: "@__kb_articles @test @map @onet", scenario_title: "Scenario 2", feature_title: "Feature 1", feature_hash_id: nil>]

but when i try to delete all specification that is related to particular project, sql is executed on main database instead of using connection to RedMine database. ( and if this could be big problem in production - of course in some circumstances )


ruby-1.9.2-p0 > project.specifications.delete_all
ActiveRecord::StatementInvalid: PGError: ERROR:  relation "specification_cache" does not exist
LINE 4:              WHERE a.attrelid = '"specification_cache"'::reg...
                                        ^
:             SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
              FROM pg_attribute a LEFT JOIN pg_attrdef d
                ON a.attrelid = d.adrelid AND a.attnum = d.adnum
             WHERE a.attrelid = '"specification_cache"'::regclass
               AND a.attnum > 0 AND NOT a.attisdropped
             ORDER BY a.attnum

    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract_adapter.rb:202:in `rescue in log'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract_adapter.rb:194:in `log'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/activerecord-3.0.3/lib/active_record/connection_adapters/postgresql_adapter.rb:483:in `query'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/activerecord-3.0.3/lib/active_record/connection_adapters/postgresql_adapter.rb:1015:in `column_definitions'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/activerecord-3.0.3/lib/active_record/connection_adapters/postgresql_adapter.rb:662:in `columns'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/arel-2.0.4/lib/arel/table.rb:93:in `columns'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/arel-2.0.4/lib/arel/table.rb:100:in `[]'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/activerecord-3.0.3/lib/active_record/associations/has_many_association.rb:78:in `delete_records'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/activerecord-3.0.3/lib/active_record/associations/association_collection.rb:222:in `block in delete'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/activerecord-3.0.3/lib/active_record/associations/association_collection.rb:525:in `block in remove_records'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/activerecord-3.0.3/lib/active_record/associations/association_collection.rb:158:in `block in transaction'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:139:in `transaction'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/activerecord-3.0.3/lib/active_record/transactions.rb:204:in `transaction'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/activerecord-3.0.3/lib/active_record/associations/association_collection.rb:157:in `transaction'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/activerecord-3.0.3/lib/active_record/associations/association_collection.rb:522:in `remove_records'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/activerecord-3.0.3/lib/active_record/associations/association_collection.rb:221:in `delete'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/activerecord-3.0.3/lib/active_record/associations/association_collection.rb:167:in `delete_all'
    from (irb):7
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/railties-3.0.3/lib/rails/commands/console.rb:44:in `start'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/railties-3.0.3/lib/rails/commands/console.rb:8:in `start'
    from /home/mc/.rvm/gems/ruby-1.9.2-p0@selleo-dashboard/gems/railties-3.0.3/lib/rails/commands.rb:23:in `<top (required)>'
    from script/rails:6:in `require'

I'm not sure but maybe AR is setting wrong engine on Arel, but not able to confirm or deny this

Source Code


class Abstract::RedMine < ActiveRecord::Base
  self.abstract_class = true
  establish_connection("redmine_#{Rails.env}")

  private

  def self.instantiate(record)
    (record[self.inheritance_column] = "RedMine::"+record[self.inheritance_column]) if record[self.inheritance_column]
    super
  end
end

class RedMine::Project < Abstract::RedMine
  # ...
  has_many :specifications, :class_name => 'RedMine::SpecificationCache'
  # ...
end

class RedMine::SpecificationCache < Abstract::RedMine
  set_table_name 'specification_cache'
end

Comments and changes to this ticket

  • rails

    rails March 1st, 2011 @ 12:00 AM

    • Tag changed from 3.0.3 active_record arel to 303 active_record arel
    • State changed from “new” to “open”

    This issue has been automatically marked as stale because it has not been commented on for at least three months.

    The resources of the Rails core team are limited, and so we are asking for your help. If you can still reproduce this error on the 3-0-stable branch or on master, please reply with all of the information you have about it and add "[state:open]" to your comment. This will reopen the ticket for review. Likewise, if you feel that this is a very important feature for Rails to include, please reply with your explanation so we can consider it.

    Thank you for all your contributions, and we hope you will understand this step to focus our efforts where they are most helpful.

  • rails

    rails March 1st, 2011 @ 12:00 AM

    • State changed from “open” to “stale”

Create your profile

Help contribute to this project by taking a few moments to create your personal profile. Create your profile »

<h2 style="font-size: 14px">Tickets have moved to Github</h2>

The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>

People watching this ticket

Pages