Использование двух или более баз данных в проекте rails - PullRequest
2 голосов
/ 14 июня 2010

Я использую базу данных внешних пользователей для различных проектов.

Теперь у меня есть модель School в моем проекте, в которой есть много пользователей, и пользователи имеют много школ.

class User < ActiveRecord::Base
  establish_connection "#{RAILS_ENV}_tunnel"
  has_many :memberships
  has_many :schools, :through => :memberships
end

class School < ActiveRecord::Base
  has_many :memberships
  has_many :users, :through => :memberships
end

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :school
end

Итак, какие у меня сейчас проблемы:

  • Я не могу вызвать school.users (потому что таблица членства находится в моей базе данных PROJECT, а не в базе данных exERnal USERS), но я могу позвонить user.schools
  • Я не могу обновить таким образом: current_user.school.find (params [: id]). Update_attributes (params [: school]), потому что таким образом он открывает соединение только для READ.

Я понимаю, как я могу взломать эту проблему, т.е.

school.users Я могу позвонить так:

class School < ActiveRecord::Base
  has_many :memberships
  # has_many :users, :through => :memberships

  def users
    User.where("users.id in (?)", self.connections.map(&:user_id))
  end
end

но этих хаков недостаточно. Потому что теперь я не могу добавлять таких пользователей, как school.users << User.find(203) или school.users.find(params[:user_id]) и другие функции, которые мне дает отношение has_many.

Итак вопрос заключается в том, как работать с двумя базами данных, которые связаны между собой множеством взаимосвязей с полной поддержкой функций.

Ответы [ 2 ]

3 голосов
/ 14 июня 2010

Я не думаю, что есть способ сделать это в Rails с полной поддержкой функций - я думаю вам лучше использовать что-то вроде федеративных таблиц MySQL перенести таблицу удаленных БД в вашу производственную БД.

0 голосов
/ 15 июня 2010

В оракуле я бы использовал для этого ссылку на базу данных.

Я не совсем уверен, но я обнаружил, что в MySQL вы можете написать

select * from db1.users , db2.schools where db1.users.school_id = db2.schools.id

и тогда вы сможете использовать это в Rails, явно указав имя таблицы в вашей модели:

class School
  set_table_name "db2.schools"
end

Это помогает?

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