рельсы 3.1 двигатели и базы данных - PullRequest
4 голосов
/ 04 июля 2011

Могут ли движки rails 3.1 иметь свои собственные базы данных и в то же время иметь доступ к базе данных основного приложения, например, для аутентификации пользователя Как я могу настроить это, если это возможно?

спасибо

Ответы [ 3 ]

5 голосов
/ 06 июля 2012

Да, они могут.Я построил движки, которые используют отдельную базу данных sqlite3.Таким образом, все функциональные возможности и данные движка изолированы.Удалите движок, удалите базу данных, и все исчезнет, ​​не оставив следа.

Прежде всего, желательно, чтобы вы создали монтируемый движок .Это создает пространство имен и изолирует движок от вашего основного приложения.Это не требование, а лучшая практика.Я предполагаю, что вы сделали в следующих примерах.

В какой-то момент вы собираетесь создать модель внутри вашего движка.В корневом пути движка введите что-то вроде этого:

$ rails generate resource Post

Это сгенерирует контроллер Post, модель и маршрут.Все идеально, за исключением миграции базы данных.Вы собираетесь удалить это.Эта миграция бесполезна, если вы хотите сохранить свои данные отдельно.Единственная цель миграции внутри движков - скопировать их в базу данных основного приложения.Так что продолжайте и избавьтесь от этого:

$ rm -r db

Теперь подключите ваш корневой маршрут и контроллер, как обычно.

В модели есть еще одно изменение, чтобы подключить егов отдельную базу данных.

module YourEngine
  class Post < ActiveRecord::Base
    establish_connection :adapter => 'sqlite3', :database => 'db/your_engine.sqlite3'
  end
end

Таким образом, модель двигателя будет использовать не основную базу данных, а ту, которую вы определяете.Ключ к пониманию заключается в том, что файл базы данных не живет внутри движка!Этот файл базы данных находится внутри хост-приложения.Поскольку вы храните все отдельно, вы должны создать эту базу данных вручную.Быстрее всего использовать инструмент командной строки sqlite3 и созданный вручную оператор create:

$ cd "the root dir of the host rails app"
$ sqlite3 db/your_engine.sqlite3

из того места, где вы создаете таблицу:

CREATE TABLE your_engine_posts (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name varchar(255) NOT NULL DEFAULT '', body text, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL);

Presto!Теперь нужно просто установить движок внутри вашего приложения, загрузить его, и все должно быть готово к работе.Очевидно, теперь, когда у вашего движка есть отдельная база данных, бесполезно работать с миграциями.Вам придется обновить схему вручную.

1 голос
/ 03 августа 2011

Если вас беспокоит конфликт имен таблиц с приложением, вы можете использовать метод isolate_namespace.Это приведет к добавлению префиксов всех имен ваших таблиц к пространству имен вашего Engine.

В Rails Casts только что был хороший учебник, который использует это, вы должны его проверить.

http://railscasts.com/episodes/277-mountable-engines

0 голосов
/ 03 августа 2011

Да, они могут.Я написал руководство по этому вопросу здесь http://railsforum.com/viewtopic.php?id=42143

...