9 Stimmen

Benutzerdefinierte Serialisierung für Felder in Rails

Gibt es eine Möglichkeit, eine benutzerdefinierte Serialisierung für Felder in Rails zu haben, eine Methode, die ausgeführt wird, wenn ein Feld gespeichert und geladen wird, um von/zu einem String zu konvertieren, der letztendlich in der Datenbank gespeichert wird.

Speziell möchte ich ein Feld vom Typ Symbol wie Geschlecht haben, mit möglichen Werten :männlich und :weiblich, die "männlich" und "weiblich" in der Datenbank speichern. Es gibt einige Workarounds, wie:

def geschlecht
  read_attribute(:geschlecht).try(:to_sym)

aber das lässt obj.attributes unverändert, also ist es eine undichte Abstraktion.

10voto

Maciej Biłas Punkte 1916

Sie können es in Rails 3.1 tun. Das Objekt, das Sie serialisieren möchten, muss auf die Methoden load und dump antworten.

Hier ist ein Beispiel für die Serialisierung eines Strings in Base64.

class User < ActiveRecord::Base
  class Base64
    def load(text)
      return unless text
      text.unpack('m').first
    end

    def dump(text)
      [text].pack 'm'
    end
  end

  serialize :bank_account_number, Base64.new
end

Weitere Details finden Sie unter: http://archives.edgerails.info/articles/what-s-new-in-edge-rails/2011/03/09/custom-activerecord-attribute-serialization/index.html

4voto

loosecannon Punkte 7653
def whachamacallit
  read_attribute("whachamacallit").to_sym
end
def whachamacallit=(name)
  write_attribute("whachamacallit", name.to_s)
end

Speichern Sie sie als Zeichenfolgen in der Datenbank, extrahieren Sie sie jedoch als Symbole, wenn Sie sie herausziehen, und konvertieren Sie sie vor dem Speichern zurück. würde mit beliebiger Anzahl oder Kombination von Zeichenfolgen / Symbolen funktionieren.

um es auf nur einige wenige zu beschränken

validates_inclusion_of :whachamacallit, :in => [ :male, :female, :unknown, :hidden ]

2voto

Cory Foy Punkte 7112

Von http://blog.quov.is/2012/05/01/custom-activerecord-attribute-serializers/

class Recipe < ActiveRecord::Base
  serialize :ingredients, IngredientsList
end

class IngredientsList < Array
  def self.dump(ingredients)
    ingredients ? ingredients.join("\n") : nil
  end

  def self.load(ingredients)
    ingredients ? new(ingredients.split("\n")) : nil
  end

0voto

loosecannon Punkte 7653

Sie können die Modelle to_xml für ein Modell definieren und es wird das tun http://api.rubyonrails.org/classes/ActiveRecord/Serialization.html

Es ist möglich, Marshall.dump zu definieren und auf diese Weise einzufügen, denke ich, aber es ist etwas, worüber man nachdenken sollte

0voto

PeterWong Punkte 15841

Sie könnten die serialize-Methode innerhalb des Modells verwenden. Bitte beziehen Sie sich auf diesen Link: http://api.rubyonrails.org/classes/ActiveRecord/Base.html (ps. suchen Sie nach dem Schlüsselwort "serialize" auf dieser Seite ;D)

Kurz gesagt, könnten Sie folgendes tun:

class YourModel < ActiveRecord::Base
  serialize :db_field
end

Rails würde automatisch das Feld vor dem Speichern in der Datenbank serialisieren und nach dem Abrufen aus der Datenbank deserialisieren.

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