2017-09-20 1 views
1

는 내가 생각하고있어 내가 말할 수있는 무언가이다 : #touch의레일에 값을 nil로 설정하고 저장하는 방법이 있습니까?

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

종류 만 전무를 설정하고 저장합니다.

수정

슈퍼 미안 해요.

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

만약'e'가'nil? '이라면'e.reload'는 에러를 발생시킬 것입니다. 당신은'존재하지 않는다면'무엇을 기대하지 않는지 명확히 할 수 있습니까? 레코드를 삭제하고 현재 인스턴스를 nillify? 아니면 기록을 없앨까요? 아니면 ('bar'와 같은) 일부 속성을'nil'으로 설정하면됩니까? – spickermann

+1

'e.bar'를 nil로 설정 하시겠습니까? 그렇다면'e.update (bar : nil)'을 할 수 있습니다. 그러면 속성이 설정되고 한 단계로 모두 저장됩니다. – moveson

+0

사용 사례는 무엇입니까? – Shobhit

답변

0

당신은 데이터베이스에 nil를 저장할 수 있으며, 객체가 특정 클래스로 생성되면 또한, 당신은 그것을 바꿀 수 없다 :이 의미한다. 새로운 객체를 생성하는 것만으로 변환 될 수 있습니다.이 가상의 nil!과 같은 내부 수정 자 (in-place modifier)가 있습니다. 당신이 얻을 수있는

가장 가까운 것입니다

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)에 코멘트의 제목을 null로 드리겠습니다 .

관련 문제