2017-03-16 5 views
1

続編4.29.0を使用しています。PostgreSQLを使用しているRubyのSequence dirty statusがjsonカラムで機能していません

アクションをトリガーするためにbefore_save続編フックを使用する予定です。この場合、以前の実装では、@changed_columns sequelインスタンス変数を使用して特定の列が変更されているかどうかを確認する必要がありますその変更された、いくつかのものは次のように:

class MyModel < Sequel::Model 
    def before_save 
    special_method if @changed_columns.include? :properties 

    super 
    end 

    def special_method 
    ... 
    end 
end 

今回私は、PostgreSQL jsonb型の列(ところで非常に便利)を使用しています。 @changed_columnsが列を保持することはありませんが、列を "ダーティ"として指定できることはわかりますが、この列が変更されたすべての場所を変更しなければならないことを意味します。

これが動作していないかの例:

irb(main):001:0> MyModel.columns 
=> [:id, :foo, :properties]  # :foo is a string, :properties is jsonb 

irb(main):002:0> my_model = MyModel.last 
=> #<MyModel @values={:id=>37, :foo=>"bar", :properties=>{"foo"=>true}}> 

irb(main):003:0> my_model.properties['foo'] = false 
=> false 

irb(main):004:0> my_model 
=> #<MyModel @values={:id=>37, :foo=>"bar", :properties=>{"foo"=>false}}> 

irb(main):005:0> my_model.modified? 
=> false      # this should be true since properties changed a value inside the hash 

irb(main):006:0> my_model.foo = 'foo' 
=> "foo" 

irb(main):007:0> my_model 
=> #<MyModel @values={:id=>37, :foo=>"foo", :properties=>{"foo"=>false}}> 

irb(main):008:0> my_model.modified? 
=> true 

irb(main):009:0> my_model.changed_columns 
=> [:foo]      # should include the :properties column 
+0

値:列値に変異を検出したい場合は、modification_detectionプラグインを使用する必要がありますか? –

+0

はい、その電話を追加してみましょう – zetacu

答えて

1

これは、続編の期待デフォルトの動作です。あなたはそれを再定義した後、プロパティ[「FOO」] `の変更である:`の

DB.extension :pg_json 
DB.create_table!(:bs){primary_key :id; jsonb :properties} 
class B < Sequel::Model; end 
B.plugin :modification_detection 
B.create(:properties=>{'a'=>1}) 
b = B.first 
b.properties['a'] = 2 
b.modified? 
# => true 
+0

tnx、それは素晴らしい、宝石btw、私は数日間今それを使用してきました。 – zetacu

関連する問題