2012-06-14 7 views
10

Ich habe ein einfaches Modell wie folgt zugreifen:wie Spaltenwert nach Serialisierung Active

class User < ActiveRecord::Base 
    serialize :preferences 
end 

ich den Rohwert von MySQL zugreifen möchten, nicht Wert vor serialize. Ist es möglich?

Ich weiß, ich

ActiveRecord::Base.connection.execute("select * from users") 

verwenden kann, aber ich will aus dem User Modell zugreifen.

Antwort

21

Aktualisiert

Ok, das ist, was Sie suchen:

User.find(params[:id]).attributes_before_type_cast["preferences"][:value] 

Diese die Zeichenfolge in seiner serialisierten Form zurückkehren wird.

Das ist das nächste, was Sie bekommen können, dass ich finden kann, es wird nicht funktionieren, wenn Sie bereits das Objekt aus der Datenbank gezogen haben.

Entschuldigung, dass Sie Ihre Frage falsch gelesen haben. Sie können dies auch vom Benutzermodell verwenden.

Lassen Sie die alte Antwort für den Fall, dass der andere Weg es für jemanden hilfreich ist.

Alte Antwort

Nur um sicher zu sein, verstehe ich die Frage, wollen Sie die Rohdaten aus der Tabelle. Die Daten, die Schienen serialisiert und in die Datenbank einfügt.

EX. Sie setzen ['site_id','last_update','last_restart'] und Sie erhalten "---\n- site_id\n- last_update\n- last_restart\n" und es wird in die Datenbank aufgenommen und gespeichert. Sie möchten dies abrufen: "---\n- site_id\n- last_update\n- last_restart\n" aus der Datenbank.

Ok, es dauerte etwas fanagaling von der Datenbank, aber Sie können es so machen.

In einem Projekt Ich habe einen serialisierte Array Anruf devise_table_preferences, die die Präferenzen listen in einer Tabelle in einer bestimmten Reihenfolge, wie so, anzuzeigen:

user.devise_table_preferences = ['site_id','last_update','last_restart'] 

Die daraus serialisierten Ansicht ist etwa so:

"---\n- site_id\n- last_update\n- last_restart\n" 

über Ihre Methode verwenden, machte ich eine Abfrage wie folgt:

preference = ActiveRecord::Base.connection.execute("SELECT devise_table_preferences FROM users WHERE id = #{@user.id}") 

Es gibt ein Objekt in der Konsole wie folgt:

preference = #<Mysql2::Result:0x007fe4cdf34850> 

Running:

preference.first[0] 

gab mir dieses:

"---\n- site_id\n- last_restart\n" 

Ich weiß, ihr eine große Arbeit um, aber es wird auf jeden Fall geben Sie Ihre Daten in seiner serialisierten Art und Weise. Hoffe, dass es dir hilft.

+0

Ich weiß, ich kann das tun (wie ich in der Frage sagte). Ich möchte nur wissen, dass es möglich ist, vom Benutzermodell zu kommen oder nicht. Danke trotzdem. :) – Chamnap

+0

@Chamnap Ich habe meine Antwort bearbeitet, um hoffentlich deine Frage zu beantworten, siehe aktualisierter Teil der Antwort. Hoffnung, die dir mehr hilft als der ältere Teil. –

+0

Ich versuche es, aber es funktioniert nicht. Ich habe den Quellcode überprüft, es gibt einfach die '@ Attribute' zurück, die bereits serialisiert sind. – Chamnap

0

Ich denke in diesen Tagen Sie folgendes sagen wollen:

User.find (params [: id]). Typecasted_attribute_value ('Einstellungen')

+0

' NoMethodError Exception: private Methode 'typecasted_attribute_value' (Rails 4.2). Vielleicht hat sich der Zugang kürzlich geändert. – mahemoff

+0

Sie sollten 'preferences_before_type_cast' in Rails 4 verwenden – MaicolBen

Verwandte Themen