Rails: разделение одной базы данных между несколькими поддоменами

Я относительно новичок в Rails, и вот моя ситуация:

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

Каждая из этих трех ветвей отслеживает одни и те же продукты, использует одни и те же модели данных, но управляется отдельно. Мой план состоит в том, чтобы создать одно приложение, использующее одну базу данных, но такую, которая отслеживает инвентаризацию во всех трех филиалах.

Мой план состоит в том, чтобы иметь что-то вроде этого:

branch1.inventoryapp.com

branch2.inventoryapp.com

branch3.inventoryapp.com

Каждый поддомен будет вести к одному и тому же интерфейсу с теми же функциями и, по сути, с одними и теми же представлениями. Единственная разница будет заключаться в фактическом содержании их инвентаря, который будет представлять собой список продуктов, которые физически находятся в этом филиале в данный момент.

Смогу ли я сделать это с маршрутизацией субдоменов rails?

Должен ли я иметь отдельные контроллеры для каждой ветки?

Должен ли я использовать пространства имен контроллера? Вложенные ресурсы?

Заранее спасибо!


person hangsu    schedule 30.06.2011    source источник


Ответы (1)


В вашем application_controller просто:

class ApplicationController < ActionController::Base
  before_filter :current_account
  helper_method :current_account

  def current_account
    @account ||= Account.find_by_domain(request.subdomain)
  end
end

Потом везде:

class WidgetsController < ApplicationController

  def index
    @widgets = current_account.widgets.paginate(:page=>params[:page])
  end

  def show
    @widget = current_account.widgets.find(params[:id])
  end

  def create
    @widget = current_account.widgets.build(params[:widget])
    if @widget.save
      ...
    end
  end
end

Ограничивая все до @account, вы разделяете данные по субдоменам.

Вы также можете использовать current_account в качестве помощника в своих представлениях.

person Jesse Wolgamott    schedule 01.07.2011
comment
Эй, Джесси, я обновил твой метод find_account, чтобы он был более прямым. Поскольку методы find_by_x вызывают исключение ActiveRecord::RecordNotFound, которое преобразуется в 404 в рабочей среде, ответственность за обработку случая отсутствия учетной записи возлагается на Rails. Это отлично работает для этого варианта использования, когда неожиданный субдомен выдаст ошибку 404. +1 - person coreyward; 01.07.2011
comment
Спасибо за быстрые ответы, это имеет большой смысл для меня прямо сейчас. Где именно хранится объем любого данного фрагмента данных? Из базы видно? - person hangsu; 01.07.2011
comment
@hangsu - если вы выполняете внутреннее соединение до учетной записи, то да, это очевидно. - person Jesse Wolgamott; 01.07.2011