2012-06-27 29 views
5

Chúng tôi có ứng dụng Rails 3 với cơ sở dữ liệu PostgreSQL (với ~ 10 bảng) được ánh xạ bởi activerecord. Mọi thứ đều ổn.Nhiều đường ray ORM

Tuy nhiên, chúng tôi cũng có thể muốn sử dụng:

  • một MongoDB cơ sở dữ liệu để lưu trữ hình ảnh (có lẽ với mongoid đá quý).
  • a Neo4j cơ sở dữ liệu (có thể là neo4j-rails đá quý) thay vì PostgreSQL cho một số bảng.

Sử dụng cơ sở dữ liệu có một đường ray ORM thật đơn giản, nhờ database.yml. Nhưng khi có nhiều hơn một ORM, chúng ta có thể xử lý như thế nào? Có cách nào tốt để làm như vậy không? Ví dụ, ActiveHash (và ActiveYaml) có thể hoạt động tốt với ActiveRecord. Tôi nghĩ rằng có thể có một khả năng để cho ORH differents làm việc cùng nhau. Cảm ơn mọi lời khuyên.

Trả lời

4

Điều này thực sự phụ thuộc vào loại ORM. Một cách tuyệt vời để làm điều này là sử dụng thừa kế. Ví dụ bạn có thể có nhiều cơ sở dữ liệu và bộ điều hợp được định nghĩa trong tệp database.yml của bạn. Bạn có thể dễ dàng nói chuyện với chúng bằng cách sử dụng phương thức setup_connection ActiveRecord.

# A typical Active record class 
class Account < ActiveRecord::Base 
    ... 
end 

# A new database connection 
class NewConnection < ActiveRecord::Base 
    self.abstract_class = true 
    establish_connection "users_database" 
end 

# A new Active record class using the new connection 
class User < NewConnection 
    ... 
end 

Các chỉ xuống bên ở đây là khi bạn đang kết nối với nhiều hoạt động cơ sở dữ liệu di cư kỷ lục có thể có được một chút dicey.

Trộn

ORMS Trộn ORM là dễ dàng. ví dụ MongoDB (với mongoid), chỉ cần dont kế thừa ra khỏi hồ sơ hoạt động và bao gồm trong mô hình bạn muốn sử dụng Mongo:

class Vehicle 
    include Mongoid::Document 

    field :type 
    field :name 

    has_many :drivers 
    belongs_to :account 

end 

ORMs được xây dựng trên mô hình hoạt động chơi rất độc đáo với nhau. Ví dụ với mongoid bạn có thể xác định các mối quan hệ với các mô hình ActiveRecord, điều này có nghĩa là bạn không chỉ có nhiều cơ sở dữ liệu nhưng chúng có thể dễ dàng giao tiếp thông qua mô hình hoạt động.

1

Trước hết, tôi đặc biệt khuyên bạn không cố gắng có nhiều ORM trong cùng một ứng dụng. Chắc chắn bạn sẽ muốn đối tượng Mongoid của bạn 'liên kết' với đối tượng ActiveRecord của bạn theo một cách nào đó. Và có nhiều cách (xem bên dưới) ... nhưng tất cả chúng cuối cùng dẫn đến đau.

Có lẽ bạn đang làm điều gì đó sai nếu bạn nghĩ rằng bạn 'cần' để làm điều này. Tại sao bạn cần MongoDB để lưu trữ hình ảnh? Và nếu bạn đang sử dụng nó như một kho lưu trữ hình ảnh, tại sao bạn lại cần Mongoid hoặc một số ORM khác (hoặc chính xác hơn, ODM)? Nếu bạn thực sự, thực sự cần phải thêm một cửa hàng dữ liệu thứ hai và một ORM/ODM thứ hai, bạn có thể quay nó ra như một ứng dụng riêng biệt và gọi nó như một dịch vụ từ một trong những đầu tiên của bạn? Hãy suy nghĩ kỹ về điều này.

Điều đó nói rằng, nếu bạn thực sự muốn đi với "sự bền bỉ đa điểm" (không phải thuật ngữ của tôi), có một viên ngọc tốt: https://github.com/jwood/tenacity. Nó không còn phát triển tích cực nữa, nhưng người duy trì không sửa lỗi và nhanh chóng trả lời các yêu cầu và yêu cầu kéo.

+0

Xin chào, tôi là nhận xét của bạn. Nghe tôi đã suy nghĩ để làm như vậy: có một DB-loại cho người dùng đăng ký và Neo4J cho logic kinh doanh.Bây giờ u nghĩ rằng tôi có thể có một Ror nhỏ mà chỉ chăm sóc của quá trình đăng nhập và sau đó khác mà chỉ tập trung vào logic kinh doanh của sản phẩm? cảm ơn! – YoniGeek

Các vấn đề liên quan