Mein Modell:prüft für geladenes SQL-Objekt in Rails
class User
has_many :items
end
class Item
belongs_to :user
def self.with_color(color, is_loaded)
if is_loaded
self.select { |i| i.color == color }
else
self.where(:color => color)
end
end
end
Es gibt 2 Arten von Code in meinem Controller.
## this line loads 'items' of the user and selects with the red color ##
@colored_items = current_user.items.with_color('red', false)
## this code should not load items twice ##
@user_with_items = User.includes(:items).find(params[:user_id])
(...)
colored_items = @user_with_items.with_color('red', true)
Wenn ich nur schreiben „wählen Sie“ Version, tut es mit 1 Beispiel arbeiten, und ‚wo‘ Version lädt Elemente wieder, auch wenn sie bereits geladen.
Wie kann ich prüfen, ob das Objekt bereits geladen ist oder nicht?
Umfang ist die gleiche Methode wie self.colored. Ihr erstes Beispiel funktioniert gut, aber das zweite Beispiel führt eine andere Abfrage aus, um nur 'rote' Elemente zu laden. Ich würde @ users_with_items.items.select {| e | tun e.color == 'red'} anstelle von scope, um bereits geladene Objekte zu verwenden. – FancyDancy
Ok, du hast Recht. Scope macht immer ein SQL. Dachte, es würde damit umgehen. Könnte etwas sein, das optimiert werden könnte. Also habe ich eine mögliche Lösung zu meiner Antwort hinzugefügt. – Deradon
Danke -). Genau wie ich brauche. – FancyDancy