Заполнение базы данных после «Зарегистрироваться» - PullRequest
2 голосов
/ 01 октября 2009

Я хотел бы заполнить различные таблицы в моей базе данных после того, как новый клиент зарегистрируется для использования нашего веб-приложения. Мне интересно, как лучше всего это сделать, главное требование - чтобы я не вмешивался в него. Большая часть данных является статической (но может быть изменена клиентом позже (например, предпочтения)), но, очевидно, для идентификации созданных записей с этим клиентом потребуется идентификатор клиента.

Я подумал над тем, чтобы поставить несколько

Object.create(:customer_id => @customer.id, :yummy => "maybe", :etc => true)

операторы в контроллере, который обрабатывает регистрацию, но этот раздражающий маленький сигнал тревоги, который говорит мне, что есть лучший способ, снова срабатывает!

Заранее спасибо за любые предложения!

Гав

Ответы [ 6 ]

3 голосов
/ 01 октября 2009

Проблема с решением khelll заключается в том, что если вы создадите новую учетную запись, используя извне действия регистрации (например, в модуле администратора), ее база данных не будет заполнена.

Так что я бы предпочел что-то вроде следующего:

class Account < ActiveModel::Base
    def after_create
        populate
    end

    private
    def populate
        # Your logic
    end
end

Обратный вызов after_create будет вызываться после создания любой учетной записи.
Это более соответствует стандартам MVC и DRY;)

2 голосов
/ 01 октября 2009

В вашем контроллере

class AccountController < ApplicationController
after_filter :populate_db  :only=>[:register] 
  def populate_db
    # whatever stuff
    Account.populate
  end
end

И поместите логику в вашу модель:

class Account < ActiveModel::Base
  def populate
  # your logic
  end
end
0 голосов
/ 02 октября 2009

Я использую файл YAML для заполнения более десяти таблиц в базе данных во время регистрации. Этот подход имеет некоторые положительные побочные эффекты для меня:

  1. Я могу легко изменить содержимое начальных данных для новой учетной записи
  2. Очень легко добавлять локализованные версии исходного контента, я могу позволить файлам YAML легко переводить через 99translations.com
  3. Я планирую добавить функцию импорта данных, чтобы новые клиенты могли импортировать свои данные во время или сразу после регистрации, чтобы они могли просто взять шаблон файла импорта и настроить его для своих собственных нужд.

Были и некоторые недостатки:

  1. Неизбежно, когда меняется схема данных, иногда мне приходится изменять все локализованные версии этих файлов.
  2. Это один кусок уродливого кода, который у меня есть, который отображает внешние ключи между всеми новыми записями. Может быть, я могу использовать некоторые дескрипторы схемы здесь ...

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

0 голосов
/ 01 октября 2009

@ Омар Куреши Вы не должны использовать функцию триггера в вашей базе данных - есть много функций, которые они могут сделать, но ActiveRecord не зависит от базы данных и имеет обратные вызовы, которые обрабатывают такие вещи, которые могут запускать триггеры. Использование чего-либо, связывающего вас с определенной системой БД, неправильно.

@ dmathieu ответ кажется лучшим. И вы должны рассмотреть возможность использования Factory girl - это отличный инструмент для заполнения БД.

0 голосов
/ 01 октября 2009

Разве вы не можете просто установить значения по умолчанию в вашей базе данных?

0 голосов
/ 01 октября 2009

два пути

  1. триггерная функция в вашей базе данных, которая делает это
  2. обратный вызов в вашей пользовательской модели при создании
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...