2012-06-14 9 views
10

Mam prosty model takiego:sposobu dostępu wartość kolumny po serializacji ActiveRecord

class User < ActiveRecord::Base 
    serialize :preferences 
end 

Chcę uzyskać dostęp do wartości surowca z MySQL, a nie wartości przed serialize. Czy to możliwe?

wiem, że mogę używać

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

Ale chcę przejść z modelu User.

Odpowiedz

21

Updated

Ok, to jest to, czego szukasz:

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

ta zwróci ciąg w postaci szeregowej.

To jest najbliższy, jaki mogę znaleźć, ale nie zadziała, jeśli obiekt został już pobrany z bazy danych.

Przepraszamy za błędne odczytanie Twojego pytania. Możesz użyć tego również w modelu użytkownika.

Pozostawienie starej odpowiedzi w górę, na wypadek, gdyby inna metoda była dla kogoś pomocna.

Old Odpowiedź

Wystarczy, aby mieć pewność, rozumiem pytanie, chcesz surowych danych z tabeli. Dane, które railsy serializują i umieszczają w bazie danych.

EX. Wstawiasz ['site_id','last_update','last_restart'] i otrzymujesz "---\n- site_id\n- last_update\n- last_restart\n" i jest on umieszczany w bazie danych i zapisywany. Chcesz odzyskać: "---\n- site_id\n- last_update\n- last_restart\n" z bazy danych.

Dobrze, zajęło mi trochę fanagallingu z bazy danych, ale możesz to zrobić tak.

W projekcie mam zserializowaną połączenia tablicy devise_table_preferences z listą preferencji wyświetlanych w tabeli w określonej kolejności, tak jak poniżej:

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

szeregowej widok z niego jest tak:

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

Stosując metodę powyżej, zrobiłem kwerendę tak:

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

Zwraca obiekt w konsoli tak:

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

Bieg:

preference.first[0] 

Dał mi to:

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

Znam Jego wielką pracę wokół, ale na pewno to dać Twoje dane w serializowany sposób. Mam nadzieję, że to pomaga.

+0

Wiem, że może to zrobić (jak powiedziałem w pytaniu). Chcę tylko wiedzieć, że można uzyskać z modelu użytkownika, czy nie. Dzięki i tak. :) – Chamnap

+0

@Chamnap Edytowałem swoją odpowiedź, aby, mam nadzieję, odpowiedzieć na twoje pytanie, zobacz zaktualizowaną część odpowiedzi. Mam nadzieję, że pomaga ci więcej niż starsza część. –

+0

Próbuję, ale to nie działa. Sprawdziłem kod źródłowy, zwracam po prostu '@ attributes', że jest już serializowany. – Chamnap

0

Myślę, że te dni chcesz powiedzieć, co następuje:

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

+0

' Exception NoMethodError: metoda prywatna 'typecasted_attribute_value' called' (Rails 4.2). Być może jego dostęp zmienił się ostatnio. – mahemoff

+0

Powinieneś użyć 'preferences_before_type_cast' w Rails 4 – MaicolBen

Powiązane problemy