Как заполнить пример данных для моего приложения Rails в производстве? - PullRequest
0 голосов
/ 02 апреля 2019

У меня вопрос n00b. Я использую Rails 5 и хотел бы иметь пример данных в приложении. Когда пользователь создает новый проект, он уже должен содержать примеры «задач», которые пользователь может удалить или отредактировать.

Я знаю, что могу использовать seed.rb для создания образцов данных в моей среде разработки. Каков наилучший способ сделать это в производственной среде для новых пользователей и как? Должен ли я использовать seed.rb, миграцию или грабли?

Пример контроллера:

  def create
    @project = Project.new(project_params)
    @project.user = current_user

    if @project.save
       // add sample content
       redirect_to @project 
    else
       render :new
    end
  end

В модели проекта:

 belongs_to :user
 has_many :tasks, dependent: :destroy

Когда новый пользователь присоединяется и создает новый проект, как я могу автоматически добавить примеры "задач" в новый проект, который он создает?

UPDATE:

Чтобы создать задачу, мне нужно описание и идентификатор текущего пользователя (я использую Devise, поэтому я могу использовать помощник current_user), например:

@project.tasks.create!(description: "hello", user_id: current_user.id)

Ответы [ 5 ]

3 голосов
/ 12 апреля 2019

Вы можете создать простой ServiceObject, который выполняет эту работу. Это позволяет вам поддерживать ваш контроллер в скине, и вы можете использовать свой current_user Devise helper, чтобы отслеживать, какой пользователь создает проект

if @project.save 
  SetupBaseProject.new(project).call
  redirect_to @project
else 
  # handle errors
end

В app/services/setup_base_project.rb

class SetupBaseProject 
  def initialize(project, user) 
    @project = project
  end

  def call
    # Create example tasks and any additional setup you want to add
    @project.tasks.create(description: 'Hello World', user: @project.user)
  end    
end 
2 голосов
/ 11 апреля 2019

Существует два возможных сценария рассмотрения вашего вопроса.

  1. В первом проекте, созданном пользователем, должны быть включены примеры задач по умолчанию
  2. При создании нового проекта, образецзадачи создаются по умолчанию.Независимо от того, является ли пользователь новым / существующим пользователем.

Для первого сценария нам нужно отследить, создан ли проект новым пользователем, добавив в него логическое поле, например: new_user, значение по умолчанию true,Мы можем использовать обратные вызовы активных записей для создания примеров задач после создания проекта.

Например, модель проекта:

belongs_to :user
has_many :tasks, dependent: destroy
after_create :generate_tasks
def generate_tasks
   if self.user.new_user #This conditional block can be modified as needed
     (1..3).each do |n|
       self.tasks.create!(description: "Sample task #{n}", user_id: self.user.id)
     end
   end
end

Для второго сценария, мы можем использовать тот же файл модели проекта ипросто удалите условный оператор, который поможет создавать примеры задач после создания проекта.

Если вам нужны какие-либо пояснения, пожалуйста, закомментируйте.

1 голос
/ 12 апреля 2019

Я делал это довольно много раз в прошлом. Исходя из моего опыта, вы в конечном итоге должны дать другим людям возможность управлять этими значениями по умолчанию (владельцы продуктов, маркетинг и т. Д.)

То, что я делал в прошлом, - это наличие тестового пользователя с проектом, который действует как проект по умолчанию.

Когда кто-либо хочет создать новый проект, вы клонируете его.

Я использовал https://github.com/amoeba-rb/amoeba для этого. Он предлагает исключительный способ переопределения атрибутов, которые я хотел бы изменить, и может каскадно клонировать любые ассоциации, которые вы хотите клонировать.

0 голосов
/ 11 апреля 2019

Полное раскрытие, я работаю в Rails 4 ...

Если бы это был я, я бы использовал FactoryBot , чтобы получить нужные фиктивные данные. Фабрики отлично подходят для тестирования, поэтому, если вы используете их для тестирования, почему бы не позаимствовать их для этого? В этом посте показан пример, когда кто-то хотел смоделировать фиктивные данные в консоли, те же идеи могут быть применимы и здесь.

После того, как ваши фабрики будут смоделированы ... возможно, для таких задач, как:

require 'faker'
FactoryBot.define do
  factory :task do
    transient do
      parent_project { nil }
    end

    description { Faker::Hacker.say_something_smart }
    project_id { parent_project.id }
  end
end

Может быть, создать метод в модели проекта, например:

def create_dummy_data
  require 'factory_bot'
  require 'faker'
  include FactoryBot::Syntax::Methods

  # create_list will spit out 3 tasks associated with your project
  create_list(:task, 3, parent_project: self)
end

Тогда в вашем примере: после вызова save ...

if @project.save
   @project.create_dummy_data  
   redirect_to @company 
else

Я не могу придумать причину, по которой вы не могли пойти по этому пути ... я пытался найти что-то в консоли, у меня не было проблем, но я бы посчитал этот ответ отправной точкой, а не окончательным решением. = Р * 1 018 *

0 голосов
/ 02 апреля 2019

Допустим, данные образца приведены на модели Detail, которая была заполнена seed.rb и принадлежит «Project».Вы можете скопировать эту запись и присвоить ее новому проекту (не проверено):

def create
    @project = Project.new(project_params)
    @project.user = current_user
    @project.details << Detail.find_by_name('sample').dup

    if @project.save 
       redirect_to @company 
    else
       render :new
    end
  end

Также рассмотрите возможность использования транзакции при сохранении данных более чем на одной модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...