connessioni multiple di database con has_many attraverso
-
25-10-2019 - |
Domanda
Come posso fare una has_many attraverso il lavoro con più connessioni al database?
Ho un database denominato "master" che contiene le informazioni sulla posizione. Che viene aggiornato da un'applicazione separata. Gli utenti possono avere accesso a molti luoghi, ma tutti gli altri modelli si trovano in un altro database denominato "budget". Ecco come i modelli sono installati.
# 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
Quando eseguo comandi tramite irb, ottengo il seguente
> 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
Ho provato ad aggiungere i binari attuali env per posto per cercare di ignorare il database predefinito per luogo, come questo:
# place.rb
classe punto quello non ha aiutato. Tutte le idee? #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
Soluzione
Un amico ha risposto questo per me, e ho pensato che potrebbe essere di qualche utilità per gli altri.
class Location < ActiveRecord::Base
#establish_connection "master"
def self.table_name() "master.locations" end
has_many :places
has_many :users, :through => :places
end
Altri suggerimenti
La risposta funziona per me, ma io uso questa versione in mio tavolo relazione:
self.table_name = "master.locations"