Rails: Доступ к базе данных не предназначен для Rails? - PullRequest
1 голос
/ 02 августа 2010

У меня есть стандартное приложение rails, которое использует базу данных mysql через Active Record, а данные загружаются с помощью отдельного процесса синтаксического анализа из довольно большого файла XML.

Все это было хорошо, но теперь мне нужно загружать данные из базы данных Oracle, а не из файла XML.

У меня нет контроля над тем, как выглядит база данных, и мне действительно нужна лишь часть данных, которые она содержит (возможно, один или два столбца из нескольких таблиц). Поэтому я действительно хочу позвонить в базу данных, вернуть данные и поместить данные в соответствующие места в моей существующей, дружественной для Rails базе данных mysql.

Как бы я поступил так? Я слышал, * вы можете (в зависимости от модели) указывать разные базы данных для моделей Rails, но похоже, что они используют их целиком (то есть база данных дружественна Rails). Могу ли я сделать прямые вызовы Oracle? Есть ли процесс, который делает это проще? Может ли Active Record сама справиться с этим?

Пример игрушки:

Если мне нужно узнать цвет, цену и местоположение объекта, то обычно я бы анализировал огромный XML-файл, чтобы получить эту информацию. Теперь, с оракулом, цвет, цена и местоположение находятся в разных таблицах, проиндексированных по некоторому идентификатору (на самом деле таблицы «Объект» не существует). Я хочу собрать всю эту информацию в моей модели Rails.

Редактировать: Похоже, что я слышал о методе ActiveRecord «create_connection» ... и он действительно предполагает, что одна модель сопоставлена ​​с одной таблицей в целевой базе данных, что не соответствует действительности в моем случае.

Редактировать Редактировать: Ах, похоже, я могу ошибаться там. «create_connection» может справиться с моей ситуацией просто отлично (просто нужно, чтобы ORACLE работал в первую очередь, и я точно знаю ... Если кто-то может помочь, вопрос в том, здесь )

Ответы [ 5 ]

4 голосов
/ 02 августа 2010

Вы можете создать соединение с Oracle напрямую, а затем заставить ActiveRecord выполнить необработанный оператор SQL для запроса ваших таблиц (во множественном числе). С макушки головы, что-то вроде этого:

class OracleModel < ActiveRecord::Base
  establish_connection(:oracle_development)

  def self.get_objects
    self.find_by_sql("SELECT...")
  end
end

С этой моделью вы можете сделать OracleModel.get_objects, который будет возвращать набор записей, при этом столбцы, указанные в операторе SELECT SQL, являются атрибутами каждого OracleModel. Очевидно, вы можете придумать более значимое название модели, чем у меня!

  • Создайте запись с именем :oracle_development в своем файле config/database.yml, указав сведения о подключении к базе данных Oracle.
2 голосов
/ 02 августа 2010

Возможно, это не совсем то, что вы ищете, но, похоже, оно достаточно хорошо подходит для вашей ситуации: http://pullmonkey.com/2008/4/21/ruby-on-rails-multiple-database-connections/

Похоже, вы можете создать произвольно названную конфигурацию базы данных в базе данных.YML-файл, а затем подключите к нему определенные модели следующим образом:

class SomeModel < ActiveRecord::Base
  establish_connection :arbitrary_database

  #other stuff for your model
end

Итак, решение состоит в том, чтобы создать модели ActiveRecord только для таблиц, из которых вы хотите получать данные из этой другой базы данных.Затем, если вы действительно хотите попасть в какой-нибудь sql, используйте ActiveRecord :: Base.connection.execute (sql).Если вам это нужно как фактический объект active_record, выполните SomeModel.find_by_sql (sql).

Надеюсь, это поможет!

0 голосов
/ 03 августа 2010

Если вам нужно только извлечь данные из базы данных Oracle, и если у вас есть возможность добавлять объекты в схему, которая может видеть нужные вам данные. , , .

Я бы упростил задачу, создав представление таблицы Oracle, которое проецирует данные, которые вам нужны, в удобной форме для ActiveRecord.

Это будет означать сохранение кода на двух уровнях приложения, но я думаю, что выигрыш в ясности на стороне клиента перевесит стоимость.

Вы также можете использовать объект СОЗДАТЬ ИЛИ ЗАМЕНИТЬ AS AS SELECT tab1. , tab2. С синтаксисом tab1, tab2, чтобы представление возвращало каждый столбец в каждой таблице.

Если вам нужно вставить или обновить изменения в вашей модели Rails, вам нужно прочитать об ограничениях для выполнения обновлений через представление.

(Кроме того, вам может понадобиться поискать работу Oracle для работы с Rails, поскольку вам может потребоваться установка клиентского программного обеспечения Oracle и дополнительных модулей Ruby).

0 голосов
/ 02 августа 2010

Вы говорите об одноразовом преобразовании данных или некотором постоянном обмене данными между вашим приложением и базой данных Oracle?Я думаю, что вы не должны вовлекать Rails. Вы можете просто сделать SQL-запрос к базе данных Oracle, извлечь данные, а затем просто вставить их в базу данных MySQL.

0 голосов
/ 02 августа 2010

У меня недостаточно очков, чтобы отредактировать ваш вопрос, но звучит так, что вам действительно нужно иметь другой «пул соединений», доступный для второй БД - я не думаю, что Oracle само по себе будет проблемой.

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

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