program tip

Model에서 self를 언제 사용해야합니까?

radiobox 2020. 11. 8. 09:43
반응형

Model에서 self를 언제 사용해야합니까?


질문 : Rails의 모델에서 언제 self를 사용해야합니까?

나는이 set내 모델 중 하나의 방법을.

class SomeData < ActiveRecord::Base
  def set_active_flag(val)
    self.active_flag = val
    self.save!
  end
end

이렇게하면 모든 것이 잘 작동합니다. 그러나 이렇게하면 :

class SomeData < ActiveRecord::Base
  def set_active_flag(val)
    active_flag = val
    save!
  end
end

active_flag 값은 변경되지 않고 조용히 실패합니다. 누군가 설명 할 수 있습니까?

나는 어떤 중복도 찾을 수 없지만 누군가가 하나를 찾으면 괜찮습니다.


메서드를 호출하는 인스턴스에서 작업을 수행 할 때 self를 사용합니다.

이 코드로

class SocialData < ActiveRecord::Base
  def set_active_flag(val)
    active_flag = val
    save!
  end
end

active_flag라는 새로운 범위의 지역 변수를 정의하고 전달 된 값으로 설정하고 아무것도 연결하지 않으므로 메서드가 존재하지 않는 것처럼 종료되면 즉시 버려집니다.

self.active_flag = val

그러나 인스턴스에 새로운 변수 대신 active_flag라는 자체 속성을 수정하도록 지시합니다. 그것이 작동하는 이유입니다.


이것은 범위 지정으로 인해 발생합니다. 메서드 내부에있을 때 다음 과 같이 새 변수 설정 하려고 할 때 :

class SomeData < ActiveRecord::Base
  def set_active_flag(val)
    active_flag = val
  end
end

set_active_flag 안에있는 새로운 변수를 만들고 있습니다. 실행이 완료 되 자마자 self.active_flag어떤 식 으로든 (실제 인스턴스 변수) 변경하지 않고 사라집니다 .

그러나 (이것은 저에게 혼란의 근원이었습니다) : 루비에서 인스턴스 변수 읽으 려고 할 때 , 다음과 같이 :

class SomeData < ActiveRecord::Base
  def whats_my_active_flag
    puts active_flag
  end
end

실제로 self.active_flag(실제 인스턴스 변수)가 반환됩니다.


그 이유는 다음과 같습니다.

Ruby는 nil.

  1. 처음에는 " active_flag범위 내에 whats_my_active_flag있습니까?
  2. 검색하고 대답이 "아니오"임을 인식하므로 SomeData 인스턴스로 한 단계 위로 이동 합니다.
  3. 다시 동일한 질문을합니다. " active_flag이 범위 내에 존재합니까?
  4. 대답은 "예"이고 "나는 당신을 위해 뭔가를 얻었습니다"라고 말하고 그것을 반환합니다!

사용자가 정의하는 경우, active_flagwhats_my_active_flag한 다음 요청, 다시 단계를 간다 :

  1. " active_flag범위 내에 존재 whats_my_active_flag합니까?
  2. 대답은 "yup"이므로 해당 값을 반환합니다.

두 경우 모두 명시 적으로 지시하지 않는 한의 값을 변경 하지 않습니다 self.active_flag.

An easy way to describe this behavior is "it doesn't want to disappoint you" and return nil -- so it does its best to find whatever it can.

At the same time, "it doesn't want to mess up data that you didn't intend to change" so it doesn't alter the instance variable itself.

Hope this helps!


It's to make sure you're using the setter method and not scoping a new variable. It's a Ruby and AR usage detail that often trips people up (the other being the (mis-)use of an instance variable).

Note there's already update_attributes! although I understand the desire to abstract.

There's also toggle!, which might be even nicer, depending on your interface to the flag.


When use active_flag = val ruby thought your are define a local variable, the best way is self.active_flag = val, if you got it, hope you know that send(:active_flag=, val) will works too.

참고URL : https://stackoverflow.com/questions/10805136/when-to-use-self-in-model

반응형