2016-07-11 11 views
1

Rails 5ではjsonbカラムにstore_accessorで公開されるフィールドを持つ新しい属性APIを使用できますか?例えば`store_accessor`で` attribute`を使用することができます

、私が持っている:

class Item < ApplicationRecord 
    # ... 
    store_accessor :metadata, :publication_date 
    attribute :publication_date, :datetime 
end 

その後、私はi = Item.new(publication_date: '2012-10-24')を呼びたい、などのハッシュことmetadata持っていると思います:{ 'publication_date' => #<DateTimeInstance> }

しかし、attributeコールは強制的に実行されていないようです。

がうまくいけば、私は何かが欠けています - それは jsonb列を扱うときに非常に有用であろう一緒にこれらの2つの機能を使用することができることのように思えます。 (なぜ、属性APIが一般的な array: trueオプションを公開していないのですか?)これはまた、この場合にも非常に便利です)。

答えて

0

もう少し掘り下げた後、私はAttributes API私はActiveRecordのはjsonbフィールドの型キャスト/強制を提供する場合、それはいいだろうと思いますなど

、— attributesハッシュに重複情報があるでしょうjsonbデータを処理するために本当に適切ではない)のActiveRecordに存在します。私はプロジェクトjsonb_accessorがあることがわかりますが、少し重いようです。また、Rails 4用に設計されているようです(私はRails 5をサポートしているかどうかはチェックしていません)。

ActiveRecord::Typeの値は実際にActiveModelで定義されているので、これはRailsの作品にあるかもしれないと思います。

今のところ私は以下を使用しています。私はHashieを本当に愛したことはありませんが、これは比較的軽量で使いやすいです:

class Item < ApplicationRecord 
    class Metadata < Hashie::Dash 

    include Hashie::Extensions::Dash::Coercion 
    include Hashie::Extensions::Dash::IndifferentAccess 

    property :publication_date, coerce: Time 

    def self.dump(obj); obj.as_json; end 
    def self.load(obj); new(obj); end 

    end 

    serialize :metadata, Metadata 
    store_accessor :metadata, :publication_date 
end 
関連する問題