12

I have a simple model like this:

class User < ActiveRecord::Base
  serialize :preferences
end

I want to access the raw value from mysql, not value before serialize. Is it possible?

I know I can use

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

But I want to access from the User model.

4

3 に答える 3

28

更新しました

わかりました、これはあなたが探しているものです:

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

これにより、文字列がシリアル化された形式で返されます。

これは、私が見つけることができる最も近いものです。データベースからオブジェクトを取得している場合は、機能しません。

質問を読み間違えてすみません。これは、ユーザーモデルからも使用できます。

他の方法が誰かに役立つ場合に備えて、古い答えを残しておきます。

古い答え

質問を確実に理解するために、テーブルからの生データが必要です。Railsがシリアル化してデータベースに配置するデータ。

元。入れ['site_id','last_update','last_restart']て取得する"---\n- site_id\n- last_update\n- last_restart\n"とデータベースに入れて保存します。これをデータベースから取得"---\n- site_id\n- last_update\n- last_restart\n"します。

わかりました、それはデータベースからいくらかの狂信を取りました、しかしあなたはそうすることができます。

devise_table_preferencesプロジェクトでは、次のように、特定の順序でテーブルに表示する設定を一覧表示するシリアル化された配列呼び出しがあります。

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

シリアル化されたビューは次のようになります。

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

上記の方法を使用して、次のようなクエリを作成しました。

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

次のようにコンソールにオブジェクトを返します。

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

ランニング:

preference.first[0]

私にこれをくれた:

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

私はそれが大きな回避策であることを知っていますが、それは間違いなくあなたのデータをシリアル化された方法で提供します。それがあなたを助けることを願っています。

于 2012-06-14T16:46:24.433 に答える
2

attributes_before_type_cast はうまくいきませんでした。

User.first.instance_variable_get(:@attributes)['preferences'].serialized_value

これは、オブジェクトがロードされていても機能します。

于 2018-09-12T09:01:29.853 に答える
0

最近、あなたは次のように言いたいと思います:

User.find(params[:id]).typecasted_attribute_value('preferences')

于 2015-01-08T14:49:13.433 に答える