Постоянство производного атрибута ActiveRecord, которое зависит от значения идентификатора - PullRequest
1 голос
/ 23 декабря 2009

Как сохранить постоянный атрибут, который зависит от значения id в rails? Фрагмент ниже, кажется, работает-- Есть ли лучший путь рельсов?

class Model < ActiveRecord::Base
  ....
  def save
    super
    #derived_attr column exists in DB
    self.derived_attr = compute_attr(self.id)
    super
  end
end

Ответы [ 2 ]

5 голосов
/ 23 декабря 2009

Обратные вызовы предоставляются, поэтому вам никогда не придется отменять сохранение. Вызов before_save в следующем коде функционально эквивалентен всему коду в вопросе.

Я сделал set_virtual_attr общедоступным, чтобы его можно было рассчитать по мере необходимости.

class Model < ActiveRecord::Base
  ...
  # this one line is functionally equivalent to the code in the OP.
  before_save :set_virtual_attr
  attr_reader :virtual_attr

  def set_virtual_attr
    self.virtual_attr = compute_attr(self.id)
  end
  private
  def compute_attr
    ...
  end  
end
3 голосов
/ 23 декабря 2009

Я думаю, что более приемлемый способ сделать это - предоставить настраиваемый установщик для виртуального атрибута, а затем предоставить хук after_create для установки значения после создания записи.

Следующий код должен делать то, что вы хотите.

class Virt < ActiveRecord::Base

  def after_create()
    self.virtual_attr = nil # Set it to anything just to invoke the setter

    save  # Saving will not invoke this callback again as the record exists
          # Do NOT try this in after_save or you will get a Stack Overflow
  end

  def virtual_attr=(value)
    write_attribute(:virtual_attr, "ID: #{self.id} #{value}")
  end
end

Запуск этого в консоли показывает следующее

v=Virt.new
=> #<Virt id: nil, virtual_attr: nil, created_at: nil, updated_at: nil>

>> v.save
=> true
>> v
=> #<Virt id: 8, virtual_attr: "ID: 8 ", created_at: "2009-12-23 09:25:17", 
          updated_at: "2009-12-23 09:25:17">

>> Virt.last
=> #<Virt id: 8, virtual_attr: "ID: 8 ", created_at: "2009-12-23 09:25:17", 
          updated_at: "2009-12-23 09:25:17">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...