Frage

Kennt jemand eine Möglichkeit, zu bestimmen, ob ein Rails Verband geladen eifrig gewesen?

Meine Situation: Ich habe eine Ergebnismenge, wo manchmal eine der Verbände ist eifrig geladen, und manchmal ist es nicht. Wenn es nicht eifrig geladen ist, dann will ich Assoziationen mit Active der Fund nachzuschlagen. Wenn es eifrig geladen wird, möchte ich erkennen, verwenden.

Zum Beispiel, sagen, dass ich in meinem Artikel Modell eine „has_many“ Array von shipping_info Objekte. Dann gilt:

Wenn Artikel eifrig ist geladen, effizienteste Last:

item.shipping_infos.detect { |si| si.region == "United States" }

Wenn Artikel nicht begierig ist geladen, effizienteste Last:

item.shipping_infos.where(region: "United States").first

Aber wenn ich nicht weiß, ob es eifrig geladen ist, ich weiß nicht, welcher Code rufen Sie den Datensatz effizient zu erhalten. Wenn ich die erste Methode verwenden, wenn es nicht eifrig geladen war, dann muss ich mehr DB Datensätze als nötig nachzuschlagen. Und wenn ich die zweite Methode verwenden, wenn es wurde eifrig geladen, dann werden meine eifrig geladenen Objekte ignoriert.

War es hilfreich?

Lösung

item.shipping_infos.loaded? wird Ihnen sagen.

Ich muss sagen, aber: Dieser Weg führt in den Wahnsinn ... bevor das Schreiben von Code, dass Tests loaded? diese Instanz sicherstellen, dass zwischen #detect und #find, zu entscheiden, wirklich Angelegenheiten in Bezug auf alles andere, was los ist auf.

Ist dies nicht der langsamste Sache ist Ihre Anwendung tut, das Hinzufügen von zusätzlichen Codepfade fügt unnötige Komplexität. Nur weil Sie eine wenig Datenbank Mühe verschwenden könnten, bedeutet nicht, müssen Sie es beheben -. Es tut wahrscheinlich keine Rolle, in irgendeiner Art und Weise messbar

Andere Tipps

Mit .association(name).loaded? auf einem Datensatz.


Für Rails <3.1 Verwendung loaded_foo?.

(Es ist seit Rails veraltet 3.1. Siehe: https://github.com/rails/ Schienen / Themen / 472 .)

Ich würde empfehlen die Verwendung item.association_cache.keys, die eine Liste der eifrigen geladenen Verbände bieten. So Sie item.association_cache.keys.include? : Name_of_association

Sie können erkennen, ob oder nicht ein einziger Verein hat mit loaded_ geladen foo ?. Zum Beispiel war, wenn shipping_info ein belongs_to Verein, item.loaded_shipping_info dann? gibt true zurück, wenn es eifrig belastet gewesen ist. Merkwürdig ist, dass es scheint, null zurückzukehren (und nicht falsch), wenn es nicht (in Rails 2.3.10 sowieso) geladen wurde.

Lösung für dieses Problem sollte foo.association(:bla).loaded? sein, aber es funktioniert nicht richtig - es überprüft und Marken Verband als schmutzig:

class Foo; has_one :bla, :autosave => true end
foo.association(:bla).loaded? #=> false
foo.save # saves foo and fires select * from bla

Also ich habe folgende Erweiterung Active hinzugefügt:

module ActiveRecord
  class Base
    def association_loaded?(name)
      association_instance_get(name).present?
    end
  end
end

und jetzt:

class Foo; has_one :bla, :autosave => true end
foo.association_loaded?(:bla) #=> false
foo.save # saves foo

Haben Sie einen Blick auf die Einschuss gem. . Dies werden Ihnen sagen, wenn Sie sollen und nicht begierig Laden verwenden sollen.

association_cached? könnte sein, eine gute Passform:

item.association_cached?(:shipping_infos)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top