Обновление модели в другую в Rails - PullRequest
0 голосов
/ 27 июля 2011

У меня есть модель с именем Details, которая содержит метод, который обновляет некоторые атрибуты с помощью вычислений с использованием атрибутов другой модели (Summary). Я вызываю этот метод в before_save, чтобы атрибуты Details 'автоматически обновлялись при изменении записи. Я хотел бы обновить мои атрибуты Details, когда я изменяю свои записи в модели Summary. То, что я ищу, может быть использовано так:

def update
    @summary = Summary.find(params[:id])
    if @summary.update_attributes(params[:summary])
      (Details.update_all_attributes)
      flash[:notice] = "Updated!"
      redirect_to edit_summary_path(@summary)
    else    
      render :action => 'edit'
    end
  end

См. Строку: Details.update_all_attributes. Все мои Details 'атрибуты будут сохранены и пересчитаны из-за введенного мной before_save. Как я могу это сделать ? Спасибо.


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

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

def update
    @summary = Summary.find(params[:id])
    if @summary.update_attributes(params[:summary])
       @details = Details.all
       @details.each do |detail|
        detail.save!
       end
       flash[:notice] = "Updated!"
       redirect_to edit_summary_path(@summary)
    else    
       render :action => 'edit'
    end
  end

Надеюсь, я помогу некоторым из вас!

1 Ответ

2 голосов
/ 27 июля 2011

Толстые модели, тощие контроллеры:

Модель

class Summary < ActiveRecord::Base
  after_update :recalculate_details

private

  def recalculate_details
   Detail.all.each {|d| d.save! }
  end
end

Контроллер

def update
    @summary = Summary.find(params[:id])
    if @summary.update_attributes(params[:summary])
       flash[:notice] = "Updated!"
       redirect_to edit_summary_path(@summary)
    else    
       render :action => 'edit'
    end
  end
...