Подтвердить что ты не робот

Как я могу использовать Mongoid и ActiveRecord параллельно в Rails 3?

Я использую rails 3 и начал свое приложение с ActiveRecord. Теперь у меня много моделей, и отношения начинают усложняться, а некоторые могут быть проще выражены с помощью Document-Oriented структуры, поэтому я бы хотел попробовать перейти на MongoDB и использовать Mongoid.

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

Например, у меня есть:

class User < ActiveRecord::Base
   has_many :items
   has_many :products, :through => :items
end

class Product < ActiveRecord::Base
   has_many :items
end

class Item < ActiveRecord::Base
   belongs_to :user
   belongs_to :product

   # alot of data that fits a hierarchical document-oriented structure
end

Я хотел бы в идеале начать с замены моей модели Item activerecord на Mongoid, поэтому мои объекты хранятся в MongoDB, а мои Users и Products могут оставаться в моей SQL DB

Вещь, я не вижу, как это сделать. Правильно ли я делаю это?

Возможно, другой альтернативой является сохранение базового AR Item

class Item < ActiveRecord::Base
   has_one :mongodb_item  ?? # I know this is wrong
end

class MongodbItem
   include Mongoid::Document
   belongs_to AR_Item ???    # I know this is also wrong
end

Спасибо!

4b9b3361

Ответ 1

Я не вижу причин, по которым у вас не могло быть модели ActiveRecord и Mongoid в одном приложении. При этом я почти уверен, что у вас возникнут проблемы, если вы попытаетесь создать отношения между моделями ActiveRecord и Mongoid.

Если ваши модели ActiveRecord сильно взаимосвязаны, но лучше подходят для структуры документа, я бы предложил просто кусать пулю и преобразовать их все в документы Mongoid. Я должен был сделать это недавно в проекте (большой-иш), и это значительно меньше стресса, чем вы думаете.

Если у вас есть хорошие модульные тесты для ваших моделей, тогда это должно быть полная привязка. Если вы этого не сделаете - сначала напишите свои юнит-тесты, убедитесь, что они передаются с помощью ActiveRecord, а затем начинают переносить вещи на Mongoid.

Ответ 2

То, что я делал, было просто издеваться над отношением к методам в каждой модели AR и модели Mongoid.

# visit_session.rb
class VisitSession
  include Mongoid::Document
  include Mongoid::Timestamps

  field :user_id, type: Integer
  index({user_id: 1},{name: :user_id_index})

  # Mock a belongs_to relationship with User model
  def user
    User.find(self.user_id)
  end
end

# user.rb
class User < ActiveRecord::Base

  # Mock a has_many relationship with VisitSession Mongoid model
  def visit_sessions
    VisitSession.where(user_id: self.id)
  end
end

Конечно, у вас не будет всех методов AR на модели Mongos для VisitSession, но вы, по крайней мере, сможете достаточно хорошо обманывать отношения между ними.

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