保存后更新不同的模型属性

时间:2014-06-17 21:51:50

标签: ruby-on-rails ruby-on-rails-3.2

我有两种不同的模型:患者和样本。患者可以有几个样本,一个样本属于患者。

这是简化的两个模型(仅包含此问题所需的信息......):

class Sample < ActiveRecord::Base
 attr_accessible :dateOfSample, :patient_attributes, :infantBreastFeedingAtThisTime, :typeBreastFeedingAtThisTime, :idadeDesmameAtThisTime

 belongs_to :patient
 accepts_nested_attributes_for :patient
end

患者模特:

class Patient < ActiveRecord::Base

  attr_accessible :date_of_birth, :infant_name, :infantBreastFeeding, :typeBreastFeeding,:idadeDesmame
  has_many :samples
end

我想要做的是,每次创建或更新样本时,如果“dateOfSample”是最后一个样本,我想用最后一个特定样本更新患者属性(:infantBreastFeeding,:typeBreastFeeding,:idadeDesmame) attributes(:infantBreastFeedingAtThisTime,:typeBreastFeedingAtThisTime,:idadeDesmameAtThisTime)

如何在示例模型中执行此操作?使用after_save?我试过但是无法通过患者的属性,所以它没有认出患者......这应该是我正在做的一个简单的错误,仍然是铁路菜鸟:)

谢谢!

更新:

我有一个表格来插入/更新样本。在那个形式里面,我对患者领域(姓名和出生日期)有一个部分。很抱歉没有发布表单,但它太大了......

1 个答案:

答案 0 :(得分:1)

你可以通过几种不同的方式解决这个问题。首先,您可以尝试after_save方法,如下所示:

class Sample < ActiveRecord::Base
  after_save :update_patient

  def update_patient
    if self.class.where(patient: self.patient).maximum(:dateOfSample) == self.dateOfSample
      self.patient.update_attributes(infantBreastFeeding: infantBreastFeedingAtThisTime,
                                     typeBreastFeeding: typeBreastFeedingAtThisTime,
                                     idadeDesmame: idadeDesmameAtThisTime)
    end
  end
end

其次,您可以在创建或更新中设置控制器中的属性。

class SamplesController < ApplicationController
  # call this in both your create and update methods before you save
  def assign_sample_attributes_to_product        
    if Sample.where(patient: @sample.patient).maximum(:dateOfSample) < @sample.dateOfSample)
      @sample.assign_attributes(infantBreastFeeding: @sample.infantBreastFeedingAtThisTime,
                                typeBreastFeeding: @sample.typeBreastFeedingAtThisTime,
                                idadeDesmame: @sample.idadeDesmameAtThisTime)
    end
  end
end

希望这可以帮助你!