Как я могу использовать 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
Спасибо!
Ответы
Ответ 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, но вы, по крайней мере, сможете достаточно хорошо обманывать отношения между ними.
Надеюсь, что это поможет.
Ответ 3
... только для целей отслеживания,
Я хотел бы добавить что-то, что я только что узнал в этом поле:
СУЩЕСТВУЕТ ваши проекты SQL + NoSQL Rails