Refactoring questo codice che produce un hash di reverse-lookup da un altro hash

0

Questo codice è basato sull'idea di un oggetto modulo link (vedi # 3 se non hai familiarità con il concetto).

Il mio codice effettivo in questione può essere trovato qui: link

Il codice accetta un hash di oggetti / attributi e crea un hash di ricerca inversa per tenere traccia delle loro deleghe per fare ciò.

delegate :first_name, :email, to: :user, prefix: true

Ma sto creando manualmente le deleghe da un hash come questo:

DELEGATIONS = {
    user: [ :first_name, :email ]
}

In fase di esecuzione quando voglio cercare i nomi degli attributi tradotti per gli oggetti, tutto ciò che devo fare è il delegato / prefisso (devo usare un prefisso per evitare conflitti di nomi) nomi di attributi come: nome_utente_nome che non sono in sincronia con le rotaie in questo modo:

en:
  activerecord:
    attributes:
      user:
        email: 'Email Address'

Il codice che ho preso l'hash delle deleghe sopra riportato e lo trasforma in una tabella di ricerca, quindi quando sovrascrivo human_attribute_name posso recuperare il nome dell'attributo originale e la sua classe. Quindi invio #human_attribute_name alla classe originale con il nome dell'attributo originale come argomento.

Il codice che ho trovato funziona, ma a dir poco è brutto. Non ho mai usato davvero #inject, quindi questo è stato un corso accelerato per me e sono abbastanza insicuro se questo metodo efficace per risolvere il mio problema. Qualcuno potrebbe consigliare una soluzione più semplice che non richiede una tabella di ricerca inversa o sembra la strada giusta da percorrere?

Grazie, - FJM

    
posta Frank Joseph Mattia 30.10.2013 - 04:22
fonte

1 risposta

0

Penso che manterrei intatte le costanti di classe effettive in modo che tu non stia saltando troppo nella libreria di ActiveSupport e crei immediatamente la tabella delle deleghe invece di avere anche la costante REVERSE_DELEGATIONS. Infine, rifatta il humanize_attribute_name in due righe per chiarezza.

class RegistrationForm
  DELEGATIONS = {
    User => [
      :first_name, :first_name=,
      :last_name, :last_name=,
      :email, :email=,
      :password, :password=,
      :password_confirmation, :password_confirmation=
    ],

    Organization => [
      :name, :name=
    ]

  }.map{|klass, attrs| attrs.map{|attr| {:"#{klass.to_s.downcase}_#{attr}" => [klass, attr]}}}.flatten.reduce({}, :merge)

  def self.human_attribute_name(method)
    klass, attribute = DELEGATIONS[method]
    klass ? klass.send(:human_attribute_name, attribute) : method
  end
end

Potresti inoltre perfezionare il reverse_mapping per creare sia: user_first_name, che: user_first_name = da just: first_name e eliminare le dichiarazioni sempre accoppiate.

    
risposta data 02.01.2014 - 17:26
fonte

Leggi altre domande sui tag