2 Stimmen

Behandlung von Null-Werten in verschachtelten Beziehungen rails 2.3.x

Das Projekt, an dem ich gerade arbeite, hat folgende Codes in der Ansicht

<%= product.provider.name %>

der obige Code ermittelt den "Anbieter" für ein Produkt und zeigt seinen Namen an. Aber meine Frage war manchmal dieser Code fehlschlägt, wenn "Anbieter" bekommt nil. (Ich weiß, seine wenig un-usual, aber da ich mit einer Legacy-DB arbeiten dies geschieht)

Also, um die Null-Validierung zu überprüfen, habe ich den folgenden Code (in meinem ApplicationHelper) geschrieben

def t(obj, attr)
    obj.nil? ? "" : obj.send(attr.to_sym)
end

Jetzt mache ich etwas in der Art

<%= t(product.provider, "name") %>

Obwohl dies funktioniert, bin ich auf ein anderes Problem gestoßen: Ich habe folgenden Code gefunden

<%= product.provider.provider_type.title %>

Das Problem dabei ist, dass im obigen Code entweder "provider" oder "provider_type" gleich Null sein kann.

Was ich suche, ist ein Mechanismus zur Behandlung von Ausnahmen, um eine beliebige Anzahl von verschachtelten Beziehungen zu behandeln.

Ich denke, ihr habt alle eine Vorstellung davon, was ich versuche...

Oder ist dies eine völlig falscher Weg zur Behandlung von Nullwerten in verschachtelten Beziehungen

Ihre Gedanken werden sehr geschätzt werden (ich bin auf Schienen 2.3.8 läuft)

vielen Dank im Voraus

Prost

sameera

5voto

Casper Punkte 31918

Dies ist ein häufiges Problem. Überprüfen Sie die folgenden Punkte:

Beispiele:

# With try
product.provider.try(:name)
product.provider.try(:provider_type).try(:title)

# With andand
product.provider.andand.name

1voto

Vasiliy Ermolovich Punkte 24087

Sie können alle Ausnahmen retten:

<%= product.provider.provider_type.title rescue nil %>

1voto

Anatoly Punkte 14770

Denn wir können #Versuchen Methoden oder die Behandlung der Ausnahmen inline, diese Methode der Verwendung bricht das Gesetz der Demeter: Jede Einheit sollte nur begrenzte Kenntnisse über andere Einheiten haben: nur Einheiten, die "eng" mit der aktuellen Einheit verbunden sind.

Views sollten die gebrauchsfertigen Ojbects/Variablen erhalten, nicht Ketten. Sie können also versuchen, die delegieren Methode innerhalb von Modellen und decken andere mit Helfern ab. Halten Sie Ihre Ansichten so sauber wie möglich und betrachten Sie sie aus der Sicht des Designers.

0voto

Victor Moroz Punkte 8971

Ich habe das Problem auf diese Weise gelöst:

class Object
  def unless_nil(default = nil, &block)
    if nil?
      default
    else
      block[self]
    end
  end
end

product.provider.unless_nil(&:name)
product.provider.unless_nil(&:provider_type).unless_nil(&:title)
product.provider.unless_nil("Not specified", &:name)

Außerdem ist es sehr praktisch, dass Object#unless_blank , Array#unless_empty , Hash#unless_empty .

Hinzugefügt:

In manchen Fällen ist die Verwendung eines vollständigen Blocks sogar bequemer:

some_variable = 
  product.provider.unless_nil do |provider|
    # some complex logic here using provider
  end

Ich mag es mehr als:

provider = product.provider
some_variable = 
  if provider
    # ...
  end

oder mit product.provider überall. Aber das ist Geschmackssache.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X