2017-09-20 3 views
1

は私が考えているのは、私が言うことができるものです。#touchのrailsの値をnilに設定して保存する方法はありますか?

e = Foo.new 
e.bar = "hello" 
e.save 
e.reload 
e.bar.nil! 
e.reload 
e.bar.nil? => true 

種類が、nilを設定し、保存します。

編集

大変申し訳ありません。

e = Foo.new 
e.bar = "hello" 
e.save 
e.reload 
e.bar.nil! 
e.reload 
e.bar.nil? => true 
+4

'e'が' nil? 'だった場合、 'e.reload'はエラーを起こします。あなたは、(もしそれが存在していれば) '何もない'と期待していることを明確にしてもらえますか?レコードを削除し、現在のインスタンスを埋め込みますか?レコードを破壊するか?あるいは、あなたの質問に 'bar'のような属性を' nil'に設定するだけですか? – spickermann

+1

'e.bar'をnilに設定したいのですか?もしそうなら、 'e.update(bar:nil)'を実行することができます。これで属性が設定され、すべてが1ステップで保存されます。 – moveson

+0

そのユースケースは何ですか? – Shobhit

答えて

0

あなたは、データベースへのnilを保存することはできません、そしてオブジェクトが特定のクラスとして作成された後、さらに、あなたはそれを変更することはできません:私はこれが意味します。新しいオブジェクトを作成することによってのみ変換することができますが、この仮想的なnil!のようなインプレース修飾子があります。あなたが得ることができる

最も近いものは次のとおりです。

e = Foo.new 
e.bar = "hello" 
e.save 
e.reload 
e.delete! 

e.reload 
e.destroyed? # => true 

f = Foo.find_by(id: e.id) 
f.nil? # => true 
+0

私はあなたが私のポイントを見逃していると思います。 Foo.newなどは、値を持つオブジェクトがあることを示すためのものです。私が求めている機能は、その特定の属性の値を除外して保存することです。 – apanzerj

+0

@apanzerj私はあなたの正確なコードに基づいており、そのコードには属性はありません。もしあなたが 'e.bar = nil'と言っていたら。 – tadman

0

多分何かのように:

module ActiveRecord 
    class Base 
    def nil!(*names) 
     unless persisted? 
     raise ActiveRecordError, <<-MSG.squish 
      cannot nil on a new or destroyed record object. Consider using 
      persisted?, new_record?, or destroyed? before nilling 
     MSG 
     end 

     unless names.empty? 
     changes = {} 

     names.each do |column| 
      column = column.to_s 
      changes[column] = write_attribute(column, nil) 
     end 

     primary_key = self.class.primary_key 
     scope = self.class.unscoped.where(primary_key => _read_attribute(primary_key)) 

     if locking_enabled? 
      locking_column = self.class.locking_column 
      scope = scope.where(locking_column => _read_attribute(locking_column)) 
      changes[locking_column] = increment_lock 
     end 

     clear_attribute_changes(changes.keys) 
     result = scope.update_all(changes) == 1 

     if !result && locking_enabled? 
      raise ActiveRecord::StaleObjectError.new(self, "nil") 
     end 

     @_trigger_update_callback = result 
     result 
     else 
     true 
     end  
    end 
    end 
end 

が初期化子でいることを入れて、それはあなたがComment.last.nil!(:title)とコメントのタイトルをゼロもらおう。

関連する問題