0

データベースに実際の列が1つあるモデルがあります。この列は、構成のJSON文字列として保存されます。この構成JSON属性内にマップしたい一連の仮想属性を使用します。基本的に、dbに多数の列を作成するのではなく、この1つのJSON属性を使用してすべてを含めます。defこれを達成するための以下の方法よりもクリーンな方法はありますか?

class Device < ActiveRecord::Base
  attr_accessible :configuration
  serialize :configuration, JSON

  attr_accessor :background_color, :title

  # below is ew
  def background_color; self.configuration["background_color"]; end
  def background_color=(value); self.configuration["background_color"] = value; end

  def title; self.configuration["title"]; end
  def title=(value); self.configuration["title"] = value; end
end

理想的には、のようなものを探していますattr_maps_to_hash :configuration, [:background_color, :title]。このようなものはありますか?

4

3 に答える 3

1

これにはActiveRecord::Storeを使用できます。

class User < ActiveRecord::Base
  store :settings, accessors: [ :color, :homepage ]
end

u = User.new(color: 'black', homepage: '37signals.com')
u.color                          # Accessor stored attribute
u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor

# Add additional accessors to an existing store through store_accessor
class SuperUser < User
  store_accessor :settings, :privileges, :servants
end

PostgreSQLを使用している場合は、HStoreを確認してください。

于 2013-03-21T21:59:07.020 に答える
1

3.2以降のRailsには、ActiveRecordに組み込まれたKey-Valueストアがあります-ここを参照してください:

テキストフィールドにKey-Valueを使用したRails3.2のデータストアの詳細はどこで読むことができますか?

あなたの場合、configurationという名前のテキストフィールドを作成して、次のようにすることができます。

class Device <AR :: Base store:configuration、accessors:[:title、:background_color、...]..。

これは、フォームなどで正常に機能するはずです。

于 2013-03-21T22:00:45.393 に答える
0

2つの方法が思い浮かびます。

まず、属性の配列[:background_color、:title]を作成し、define_methodを呼び出しながらそれらを反復処理することができます。define(method_name)とdefine( "#{method_name} =")の2つのメソッドを定義します。

第二に、同様のアイデアですが、メソッドを使用していません。

def method_missing(method_name, *args, &block)
  ...see if it's a get or set...
  ...do your stuff...
  ...rain dance...
  ...yay...
end
于 2013-03-21T22:00:41.613 に答える