Как рассчитать и сохранить производное значение ActiveRecord - PullRequest
0 голосов
/ 11 января 2011

У меня есть объект данных, который состоит из трех дочерних экземпляров одного и того же объекта.Мне нужно рассчитать значение из этого объекта и сохранить его в базе данных.(Позже он извлекается из БД другим приложением.)

Я смоделировал структуру моего класса ниже, в основном я хочу метод, который сложит вместе значения Child data_one и data_two и сохранит его втретья переменная, всего.Я думаю, что это будет total_first, total_second и total_third в родительской таблице db.Должен ли я объявить 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 Ответ

2 голосов
/ 11 января 2011

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

У тебя должны быть свои причины.

Я бы использовал обратные вызовы, как вы описали. Может быть, before_validations и есть подтверждение. Обратите внимание, что возвращение неверного значения в обратном вызове может привести к сохранению записи , а не .

E.G Если условие ложно, метод возвращает nil и может остановить цепочку обратного вызова save.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...