Also dachte ich, ich hatte diese Arbeit letzte Nacht, könnte es geschworen haben. Jetzt geht es nicht mehr, und ich denke, es ist an der Zeit, um Hilfe zu bitten.Rubin auf Schienen dynamische Attributfelder von DB mit method_missing Probleme
Im definierende dynamischen Feldern in der Datenbank, semi EAV-Stil, und im Moment nur sagen, läßt ich dont care Ihre Meinungen zu hören, ob EAV ist eine gute Idee oder nicht :)
Sowieso Im es ein wenig zu tun anders als ich es in der Vergangenheit gemacht habe, im Grunde, wenn ein Attribut (oder Feld) hinzugefügt wird, erstelle ich eine Add-Spalte zu einer bestimmten Attributtabellenmigration und führe es aus (oder entferne es) - ANYWAYS, weil es einen Kategorie-Layer gibt in der Mitte sitzen, die die direkte Beziehung ist, in der alle Attribute definiert sind, kann ich den tatsächlichen Attributnamen nicht als Spaltennamen verwenden, da die Attribute kategoriespezifisch sind.
Also, wenn es hilft Ihnen
Entity
belongs_to :category
Category
has_many :entities
EntityAttribute
belongs_to :category
EntityAttributeValue
belongs_to :entity_attribute
belongs_to :entity
und EAV-Tabelle umfasst horizontal zu visualisieren als neue Attribute erstellt werden, mit Spalten attribute_1 attribute_2 markiert, die die Werte für diese bestimmte Einheit enthalten.
Sowieso - Ich versuche, die Methoden dynamisch auf das Entity-Modell zu machen, kann ich @ entity.actual_attribute_name so nennen, anstatt @ entity.entity_attribute_value.field_5
Hier ist der Code, den ich Arbeit gedacht war - -
def method_missing(method, *args)
return if self.project_category.blank?
puts "Sorry, I don't have #{method}, let me try to find a dynamic one."
puts "let me try to find a dynamic one"
keys = self.project_category.dynamic_fields.collect {|o| o.name.to_sym }
if keys.include?(method)
field = self.project_category.dynamic_fields.select { |field| field.name.to_sym == method.to_sym && field.project_category.id == self.project_category.id }.first
fields = self.project_category.dynamic_field_values.select {|field| field.name.to_sym == method }
self.project_category_field_value.send("field_#{field.id}".to_sym, *args)
end
end
Dann heute als ich zurück nach Code ging, erkannte ich, obwohl ich das Attribut in Schienen Konsole einstellen könnte, und es wäre das richtige Feld zurückkehren, wenn ich den Datensatz gespeichert wurde die EntityAttributeValue keine Aktualisierungen (dargestellt als self.project_category_field_value, oben.)
So nach dem Blick in es weiter sah es so aus, als ob ich nur eine before_update oder before_save Callback hinzufügen musste, um das Attribut manuell zu speichern, und das ist, wo ich bemerkte, in Callback, würde es den Callback method_missing ausführen, als ob das Objekt war Dupliziert werden (und das neue Objekt war Kopie des ursprünglichen Objekts), oder etwas, ich bin nicht ganz sicher. Aber zu irgendeinem Zeitpunkt während des Speichervorgangs oder davor verschwindet mein Attribut in Vergessenheit.
Also, ich denke, ich habe meine eigene Frage halb beantwortet, nachdem ich es eingegeben habe, muss ich eine Instanzvariable setzen und überprüfen, ob es am Anfang meiner method_missing-Methode existiert (richtig?) Vielleicht ist das nicht was Ich weiß es nicht, aber ich frage auch, ob es einen besseren Weg gibt zu tun, was ich versuche zu tun. Wenn method_missing eine schlechte Idee ist, dann erkläre bitte, warum ich, wenn ich Beiträge über Methodenverweise durchführe, hörte, dass einige Leute sie zuschlägten, aber keiner von diesen Leuten eine vernünftige Erklärung dafür lieferte, warum die fehlende Methode eine schlechte Lösung war .
Vielen Dank im Voraus.
danke für die Antwort, ich war nicht in der Lage, es funktioniert allein über den Code oben, aber ich habe einige davon in Refactoring, so akzeptierte ich als Antwort – thrice801