Pregunta

¿Cómo puedo hacer un trabajo a través del trabajo con múltiples conexiones de bases de datos?

Tengo una base de datos llamada "Master" que contiene la información de ubicación. Eso se actualiza desde una aplicación separada. Los usuarios pueden tener acceso a muchas ubicaciones, pero todos los demás modelos están ubicados en otra base de datos llamada "Presupuesto". Así es como se configuran los modelos.

# place.rb
class Place < ActiveRecord::Base
  belongs_to :user
  belongs_to :location
end

# user.rb
class User < ActiveRecord::Base
  has_many :locations, :through => :places
  has_many :places
end

# location.rb
class Location < ActiveRecord::Base
  establish_connection "master"
  has_many :places
  has_many :users, :through => :places
end

Cuando ejecuto comandos a través de IRB, obtengo lo siguiente

> Location.first.places.create(:user_id => 1)
> #<Place id: 1, user_id: 1, location_id: 1, created_at: "2011-11-28 20:58:43",  updated_at: "2011-11-28 20:58:43">

> Location.first.places
> [#<Place id: 1, user_id: 1, location_id: 1, created_at: "2011-11-28 20:58:43", updated_at: "2011-11-28 20:58:43">]

> Location.first.users
> [#<User id: 1, username: "toby", role: "guest", created_at: "2011-11-28 17:45:40", updated_at: "2011-11-28 17:45:40">

> User.first.locations
> Mysql2::Error: Table 'master.places' doesn't exist: SELECT `locations`.* FROM `locations` INNER JOIN `places` ON `locations`.`id` = `places`.`location_id` WHERE `places`.`user_id` = 1 ActiveRecord::StatementInvalid: Mysql2::Error: Table 'master.places' doesn't exist: SELECT `locations`.* FROM `locations` INNER JOIN `places` ON `locations`.`id` = `places`.`location_id` WHERE `places`.`user_id` = 1

Intenté agregar el envío de rieles actuales al lugar para tratar de anular la base de datos predeterminada para el lugar, así: # lugar.rb class place <activerecord :: base statk_connection rails.env pertenencias_to: usuario pertenencias_to: final de ubicación final

#database.yml

master:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: master
  pool: 5
  username: root
  password:
  socket: /var/run/mysqld/mysqld.sock
development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: budget_development
  pool: 5
  username: root
  password:
  socket: /var/run/mysqld/mysqld.sock

Eso no ayudó. ¿Algunas ideas?

¿Fue útil?

Solución

Un amigo respondió esto por mí, y pensé que podría ser de alguna utilidad para otros.

class Location < ActiveRecord::Base
  #establish_connection "master"
  def self.table_name() "master.locations" end
  has_many :places
  has_many :users, :through => :places
end

Otros consejos

La respuesta funciona para mí, pero uso esta versión en mi tabla de relaciones:

self.table_name = "master.locations"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top