Conexiones de bases de datos múltiples con Has_Many a través de
-
25-10-2019 - |
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?
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"