несколько соединений с базой данных через has_many - PullRequest
7 голосов
/ 29 ноября 2011

Как я могу заставить has_many работать с несколькими подключениями к базе данных?

У меня есть база данных с именем "master", которая содержит информацию о местоположении. Это обновляется из отдельного приложения. Пользователи могут иметь доступ ко многим местоположениям, но все остальные модели находятся в другой базе данных с именем «бюджет». Вот как настроены модели.

# 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

Когда я запускаю команды через irb, я получаю следующее

> 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

Я попытался добавить текущий enils rails в Place, чтобы попытаться переопределить базу данных по умолчанию для place, например: # place.rb Класс Place

#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

Это не помогло. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 04 декабря 2011

Друг ответил мне за это, и я подумал, что это может быть полезным для других.

class Location < ActiveRecord::Base
  #establish_connection "master"
  def self.table_name() "master.locations" end
  has_many :places
  has_many :users, :through => :places
end
1 голос
/ 02 июня 2015

Ответ работает для меня, но я использую эту версию в моей таблице отношений:

self.table_name = "master.locations"
...