在 Rails 中将模型更新为另一个模型

Posted

技术标签:

【中文标题】在 Rails 中将模型更新为另一个模型【英文标题】:Updating a model into another one in Rails 【发布时间】:2011-07-27 13:09:25 【问题描述】:

我有一个名为 Details 的模型,其中包含一个方法,该方法通过使用另一个模型的 (Summary) 属性来更新某些属性的计算。我将该方法称为before_save,以便在我修改条目时自动更新Details' 属性。当我修改 Summary 模型中的条目时,我想更新我的 Details' 属性。我正在搜索的是可以这样使用的东西:

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。由于我放了before_save,我所有的Details' 属性都将被保存并重新计算。我怎样才能做到这一点 ?谢谢。


编辑:

我刚刚找到了答案。我做了一个循环来保存我的所有条目。

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

希望我能帮助你们中的一些人!

【问题讨论】:

这两个模型是否以某种方式相关,还是您尝试调用的类方法? 我刚刚找到了我正在搜索的内容。我将在 8 小时内发布我的答案,因为我现在做不到。 【参考方案1】:

胖模型,瘦控制器:

型号

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

【讨论】:

感谢您的提示!我会这样做的!

以上是关于在 Rails 中将模型更新为另一个模型的主要内容,如果未能解决你的问题,请参考以下文章

Rails 6.0 在为一种用户创建和更新时验证密码是不是存在,但只为另一种用户更新

在 RAILS 中将模型从一个控制器动作传递到另一个控制器动作的替代方法

Rails:在 HABTM 关系中将子项从大型记录集添加到父模型的 UI

在 Rails 中将整个应用程序共享的部分放在哪里?

Rails:更新模型属性而不调用回调

在 Rails 6 中更新底层模型时如何使动作缓存过期?