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
.
- 처음에는 "
active_flag
범위 내에whats_my_active_flag
있습니까? - 검색하고 대답이 "아니오"임을 인식하므로 SomeData 인스턴스로 한 단계 위로 이동 합니다.
- 다시 동일한 질문을합니다. "
active_flag
이 범위 내에 존재합니까? - 대답은 "예"이고 "나는 당신을 위해 뭔가를 얻었습니다"라고 말하고 그것을 반환합니다!
사용자가 정의하는 경우, active_flag
내 whats_my_active_flag
한 다음 요청, 다시 단계를 간다 :
- "
active_flag
범위 내에 존재whats_my_active_flag
합니까? - 대답은 "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
'program tip' 카테고리의 다른 글
필터를 통해 STDERR 만 파이프 (0) | 2020.11.08 |
---|---|
<<의 용도는 무엇입니까? (0) | 2020.11.08 |
Bash를 사용하여 인터넷에서 Linux 서버로 파일을 다운로드하는 방법 (0) | 2020.11.08 |
Pandas DataFrame에서 잘못된 값을 None으로 바꿉니다. (0) | 2020.11.08 |
Gson이 POJO의 ArrayList를 직렬화하는 데 문제가 있습니다. (0) | 2020.11.07 |