如何计算和保存派生的ActiveRecord值

时间:2011-01-11 08:34:49

标签: ruby-on-rails ruby activerecord ruby-on-rails-3

我有一个数据对象,它由同一个对象的三个子实例组成。我需要从该对象计算一个值并将其保存在数据库中。 (它后来被另一个应用程序从数据库中拉出来。)

我已经在下面模拟了我的类结构,基本上我想要一个将Child值data_one和data_two加在一起的方法,并将它存储到第三个变量total中。我猜这将是db父表中的total_first,total_second和total_third。我应该将total声明为Child属性并使用回调来设置它吗?任何帮助将不胜感激 - 谢谢!如果这是一个非常明显的问题,请道歉......

class Child

  attr_reader :data_one, :data_two

  def initialize(data_one, data_two)
    @data_one, @data_two, 
  end

  def ==(other_child)
    data_one           == other_child.data_one           && 
    data_two           == other_child.data_two             
  end

  def Sdq.from_params(hash)
    Sdq.new(
      get_value(hash, :data_one),
      get_value(hash, :data_two),
    )
  end

  protected
    def Sdq.get_value(hash, key)
      hash.has_key?(key) ? hash[key] : hash[key.to_s]
    end
end 


class Parent < ActiveRecord::Base

  composed_of :first_child, :class_name => "Child", :mapping => [
    ["data_one_first","data_one"],
    ["data_two_first","data_two"]
  ]

  composed_of :second_child, :class_name => "Child", :mapping => [
    ["data_one_second","data_one"],
    ["data_two_second","data_two"]
  ]

  composed_of :third_child, :class_name => "Child", :mapping => [
    ["data_one_third","data_one"],
    ["data_two_third","data_two"]
  ]

end

1 个答案:

答案 0 :(得分:2)

我无法想象为什么父母总会有两个孩子,为什么不是一个多元关系呢?取决于你是否需要多对多。希望没有看到这个例子。

你必须有自己的理由。

我会像你描述的那样使用回调。也许before_validations并对其进行一些验证。请注意,在回调中返回非true值会导致记录保存。

E.G如果条件为false,则该方法返回nil并且可以暂停保存回调链。

def before_save
   if something_sometimes_is_false
       #do normal code
   end # could not run, which would return nil and break things
end

考虑最后回归自我。

def before_save
    if something_sometimes_is_false
        # do normal code
    end
    self # should always be a true value in an instance of a class. will not break call backs
end