Rails: создание записей по умолчанию для отношений has_many

У меня есть приложение rails 3.2 для планировщика бюджета.

В моей модели есть пользователь, у пользователя есть один бюджет, и у каждого бюджета есть много Budget_items. При создании пользователя для него создается бюджет.

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

Я хотел бы как можно более чистую реализацию, так как я пытаюсь делать вещи «правильным образом» в Rails (еще не совсем так, если вы видите какой-либо необычный код:)

Мой код можно увидеть здесь: https://github.com/michaelward82/WeddingPlanner

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


Редактировать:

Мне удалось создать записи по умолчанию, изменив мой BudgetsController следующим образом:

class BudgetsController < ApplicationController
  def show
    if current_user
      @budget = current_user.budget
      if @budget.budget_items.empty?
        set_default_budget_items @budget
      end
    else
      redirect_to log_in_path
    end
  end

  def update
    @budget = current_user.budget
    if @budget.update_attributes(params[:budget])
      redirect_to budget_path, :flash => { :success => "Budget changes saved" }
    else
      redirect_to budget_path, :flash => { :error => "Budget changes were not saved" }
    end
  end

  private

  def set_default_budget_items(budget)
    default_budget_items = [
      { "description"=>"Insurance", "estimated_cost"=>"110", "actual_cost"=>"0", "position"=>"1"},
      { "description"=>"The Service", "estimated_cost"=>"520", "actual_cost"=>"0", "position"=>"2"},
      { "description"=>"Reception (venue, food & drinks)", "estimated_cost"=>"4000",  "actual_cost"=>"0", "position"=>"3"}
    ]

    default_budget_items.each {|b| @budget.budget_items.new(b) }
  end
end

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


person michaelward82    schedule 21.04.2012    source источник
comment
семена пробовали? вы также можете заполнить файл seed.rb значениями по умолчанию.   -  person Said Kaldybaev    schedule 23.04.2012
comment
Это не данные, которые должны быть при создании БД, это данные, которые должны существовать для каждого нового пользователя приложения в соответствии с его бюджетом. Я не думаю, что семя сделает то, что я хочу.   -  person michaelward82    schedule 23.04.2012


Ответы (1)


Я думаю, что вы делаете тяжелый контроллер, и это, вероятно, следует перенести в модель. Вы хотите, чтобы ваши контроллеры были тонкими, где это возможно. Есть много статей об этом Google Rails Skinny Controllers.

http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model

Я бы использовал обратный вызов (вероятно, after_create), в зависимости от того, что именно вы планируете для остальной части приложения.

person Stu    schedule 23.04.2012
comment
Спасибо за ваш ответ, и я очень ценю связанную статью. - person michaelward82; 23.04.2012