Rails 3: миграция модели в MongoDB - PullRequest
2 голосов
/ 25 мая 2011

У меня есть несколько моделей в моем существующем приложении на Rails 3, которые совершенно не связаны с другими моделями в экосистеме приложения.Базовые данные невероятно велики, и было бы полезно переместиться из моей реляционной базы данных (MySQL) в нереляционное хранилище данных документа, такое как MongoDB.Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что модель создается в нескольких местах в моей базе кода с использованием Foo.create, Foo.new и т. Д. У меня следующие вопросы:

  • Чтодля меня идеальный способ использовать MongoDB и MySQL бок о бок в приложении Rails 3?

  • Должен ли я использовать метод ghost в ActiveRecord.create для модели, которую я хочуперейти на MongoDB и написать там логику, которая сохраняет его в другом хранилище данных?Это звучит очень хрупко, но это всего лишь мысль.

Ответы [ 3 ]

3 голосов
/ 25 мая 2011

1) Просто сделайте это, используя mongoid или mongo_mapper.Оба великолепны!

2) НЕТ! Замените суперкласс ActiveRecord на суперкласс mongoid или mongo_mapper.

Единственная сложность в сохранении полиглотазапомнить слово, полиглот.Не переусердствуйте.Модели, которые наследуют ActiveRecord, сопоставляются с SQL-db, модели, которые не наследуют его, - нет.Просто как тот.То же самое с моделями, которые наследуют Mongo-ORM-класс, только они отображаются в MongoDB.

Я использую PostgreSQL вместе с MongoDB (mongo_mapper).Всем удивительно, что каждый может попробовать - хранить ошибки в документации Mongo.Ударяет файлы * .log.

Последнее замечание: наличие Foo.create и Foo.new в нескольких местах - это запах кода, и вам, вероятно, следует провести рефакторинг в соответствии с DRY и SRL.Просто дружеская заметка :)

2 голосов
/ 25 мая 2011

Нет никаких проблем с наличием некоторых классов в ActiveRecord и некоторых в Mongoid, просто перенесите данные поверх.

Это довольно упрощенный пример, но ниже вы все равно сможете сказать @account.transactions

class Account < ActiveRecord::Base

  def transactions
    Transaction.where(:account_id=>self.id).all
  end

end

class Transaction
  include Mongoid::Document
  field :account_id, :type=>Integer

  def account
    Account.find(account_id)
  end
end
1 голос
/ 25 мая 2011

Посмотрите на mongoid , формула для mongodb. Он использует ActiveModel и может вести себя так же, как ваши модели на основе ActiveRecord. Как только вы включите в документ класс mongoid, добавьте поля и настройте соединение, оно должно быть достаточно прозрачным.

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