Pattern per il passaggio in un campo come parametro

2

Sto scrivendo un'app Rails che utilizza ActiveRecord ORM e un DB Postgres. Ho due attributi che sono simili ma sono campi separati nel database. L'assegnazione e il salvataggio di questi è un po 'complicato, quindi ho messo quel lato delle cose nel loro stesso metodo. Lo pseudo-codice è il seguente

myObject.attr_a = get_the_stuff_from( ref_one )
myObject.attr_b = get_the_stuff_from( ref_two )

myObject.assign_and_save( attr_a )
myObject.assign_and_save( attr_b )

In sostanza, come posso dire al metodo assign_and_save di distinguere tra attr_a e attr_b in modo che vengano salvati nelle rispettive colonne nel database. Stavo pensando di usare un flag aggiuntivo per la firma del metodo, ma penso che stunts la sua riutilizzabilità.

Che cosa consiglieresti?

    
posta J Smith 25.08.2015 - 11:57
fonte

1 risposta

0

Dato che stai usando Rails, il modo più comune per ottenere ciò che stai cercando di fare è usare before_save o before_create callback ActiveRecord .

class Model < AR::Base
  before_save :normalize_attributes

  private

  def normalize_attributes
    # Whatever logic you need
  end
end

my_object.attr_a = get_the_stuff_from(ref_one)
my_object.attr_b = get_the_stuff_from(ref_two)
my_object.save

A seconda della tua logica, forse get_the_stuff_from si trova meglio nel modello stesso, quindi potresti preferire qualcosa come:

class Model < AR::Base

  def set_attributes(stuff_for_a: nil, stuff_for_b: nil)
    # Something like, depending on your logic:
    self.a ||= get_the_stuff_from(stuff_for_a)
    self.b ||= get_the_stuff_from(stuff_for_b)
  end

  private

  def get_the_stuff_from(ref)
    # Whatever logic you need
  end
end

# Either
my_object.set_attributes(stuff_for_a: ref_one)
my_object.set_attributes(stuff_for_b: ref_two)

# Or
my_object.set_attributes(stuff_for_a: ref_one,
                         stuff_for_b: ref_two)

my_object.save

Ma non conosco abbastanza la tua logica per dire se il ||= è sufficiente, ma spero che questo possa aiutarti.

    
risposta data 25.08.2015 - 14:28
fonte