Подключение к нескольким базам данных в ruby ​​на рельсах

Ваша переменная ids будет построена из «строк», а не ObjectId значений.

Мангустировать «autocasts» строковые значения для ObjectId в их правильный тип в регулярных запросах, но это не происходит в конвейере агрегации , как описано в номере № 1399.

Вместо этого вы должны выполнить правильное литье, чтобы ввести вручную:

ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) })

Затем вы можете использовать их в своем конвейере:

{ "$match": { "_id": { "$in": ids } } }

Причина в том, что конвейеры агрегации «обычно» изменяют структуру документа, и поэтому mongoose не делает никаких предположений о том, что «схема» применяется к документу на любой стадии конвейера.

Можно утверждать, что этап «первого» конвейера, когда это этап $match, должен сделать это, поскольку документ действительно не изменяется. Но сейчас это не так.

Любые значения, которые могут быть «строками» или, по крайней мере, не корректным типом BSON, должны быть вручную отобраны для соответствия.

29
задан user1428970 26 June 2013 в 03:46
поделиться

2 ответа

Для соединения с несколькими базами данных вам необходимо добавить следующие коды в файл database.yml. Здесь я приведу пример соединения двух баз данных из приложения rails

config / database.yml

development:
  adapter: mysql2
  database: db1_dev
  username: root
  password: xyz
  host: localhost

development_sec:
  adapter: mysql2
  database: db2_dev
  username: root
  password: xyz
  host: localhost

production:
  adapter: mysql2
  database: db1_prod
  username: root
  password: xyz
  host: your-production-ip

production_sec:
  adapter: mysql2
  database: db2_prod
  username: root
  password: xyz
  host: your-production-ip

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

Теперь нам нужно подключить модель к базам данных. Когда вы запускаете ваше приложение в режиме разработки и производства, все модели будут отображаться с помощью параметров db разработки и производства, которые были упомянуты в вашем database.yml. Поэтому для некоторой модели нам нужно подключиться к другой базе данных.

Предположим, что у нас есть две модели User и Category. Таблица пользователей находится в db1_dev и db1_prod, таблица категорий в db2_dev и db2_prod.

Модель категории

class Category < ActiveRecord::Base
  establish_connection "#{Rails.env}_sec"
end

Аналогично, когда вы добавляете новую миграцию для второй базы данных, необходимо добавить следующий код к ней.

class CreateRewards < ActiveRecord::Migration
  def connection
    ActiveRecord::Base.establish_connection("#{Rails.env}_sec").connection
  end

  def change
    # your code goes here.
  end
end

Надеюсь, это сработает для вас :).

70
ответ дан nslocum 26 June 2013 в 03:46
поделиться

Используйте establish_connection для переключения на другую базу данных:

ActiveRecord::Base.establish_connection(
  :adapter  => "mysql",
  :host     => "localhost",
  :username => "myuser",
  :password => "mypass",
  :database => "somedatabase"
)

Вы также можете передать предварительно сконфигурированную среду из database.yml, например:

ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['other_env'])

Вы также можете установить его для конкретной модели:

MyClass.establish_connection(...)
18
ответ дан PinnyM 26 June 2013 в 03:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: