Mặc dù đã tìm thấy nhiều ví dụ về đa thai trong các ứng dụng Rails khi tôi lần đầu tiên bắt đầu làm việc đó, tôi cũng không thể tìm thấy một ví dụ nào khiến tôi cảm thấy hoàn toàn thoải mái. Nhưng cuối cùng tôi cũng có một giải pháp mà tôi hài lòng.
Tôi bắt đầu với railscast 'đa thai với phạm vi'
http://railscasts.com/episodes/388-multitenancy-with-scope
sau đó xem xét việc thực hiện nhiều hợp đồng thuê nhà với việc tạo ra các tên miền phụ bằng cách sử dụng hướng dẫn này:
https ://github.com/plataformatec/devise/wiki/How-To:--Isolate-users-to-log-into-a-single-subdomain
Nhưng tôi không coi đó là mệnh giá; Tôi nghiên cứu để thực sự hiểu cách mà devise hoạt động theo cách đó.
Khi tôi đã có tất cả những thứ đó tại chỗ, tôi đã sẵn sàng cho viên ngọc nhiều người:
https://github.com/wireframe/multitenant
Nhưng tôi không dừng lại ở đó. gem multitenant yêu cầu bạn nói Multitenant.with_tenant bất cứ khi nào bạn muốn mọi thứ có phạm vi phù hợp, vì vậy tôi đã tạo một TenantController trông giống như sau:
around_filter :scope_current_tenant
def scope_current_tenant
begin
Firm.current = Firm.find_by_subdomain!(request.subdomain)
rescue
raise ActionController::RoutingError.new('Not Found')
end
Multitenant.with_tenant Firm.current do
yield
end
ensure
Firm.current = nil
end
end
và sau đó bất kỳ bộ điều khiển nào mà tôi muốn được đối tượng thuê sẽ kế thừa từ TenantController chứ không phải ApplicationController. Bằng cách đó, tôi không phải nhớ bất cứ điều gì trong các chi tiết của bộ điều khiển, nó 'chỉ hoạt động'. điều duy nhất mà các nhà phát triển phải nghĩ đến là 'đây có phải là bộ điều khiển đang xử lý dữ liệu của người thuê không?'
Mặc dù điều này vẫn phụ thuộc vào việc các nhà phát triển thực hiện một số điều chính xác (kế thừa từ bộ điều khiển phù hợp, có nghĩa là 'act_as_multitenant' trong mô hình, nó hoạt động thực sự tốt trong thực tế.