ActiveRecord 모델에서 getter 메서드를 어떻게 덮어 쓸 수 있습니까?
ActiveRecord 모델의 getter 메서드를 덮어 쓰려고합니다. name
model 이라는 속성 Category
이 있으며 다음과 같은 작업을 수행하고 싶습니다.
def name
name_trans || name
end
경우 name_trans
속성이 nil이 아닌, 다음, 그렇지 않은 경우의 반환 name
속성을. 어떻게해야합니까?
그런 다음 일반적으로 다음과 같이 호출해야합니다.
@category.name
레일 스타일 가이드를 사용하는 것이 좋습니다 self[:attr]
이상 read_attribute(:attr)
.
다음과 같이 사용할 수 있습니다.
def name
name_trans || self[:name]
end
업데이트 : Rails 스타일 가이드 에 따라 선호되는 방법 self[:name]
은 read_attribute
및 대신 사용하는 것입니다 write_attribute
. 나는 당신이 내 대답을 건너 뛰고 대신 이것을 선호하는 것이 좋습니다 .
read_attribute
실제로 name 속성의 값을 가져오고 name
메소드에 대한 재귀 호출을 피하는 데 사용해야한다는 점을 제외하면 정확히 그렇게 할 수 있습니다 .
def name
name_trans || read_attribute(:name)
end
getter 메서드를 덮어 쓰는 또 다른 옵션을 추가하고 싶습니다. 간단히 : super입니다.
def name
name_trans || super
end
이것은 속성 getter 메소드뿐만 아니라 연관 getter 메소드에서도 작동합니다.
getter를 재정의하고 사용하는 read_attribute
것은 연결에 대해 작동하지 않지만 alias_method_chain
대신 사용할 수 있습니다 .
def name_with_override
name_trans || name_without_override
end
alias_method_chain :name, :override
이와 같은 상점 속성을 사용하는 경우
store :settings, accessors: [:volume_adjustment]
또는 보석 링크 와 같은 보석 사용hstore_accessor
따라서 store
모델에서 메서드를 사용하게 된 다음 사용할 수없는 메서드를 재정의하려면 다음 과 같이 self.read_attribute
대신 사용해야 super
합니다.
def partner_percentage
super.to_i || 10
end
누군가 name_trans
getter 메소드에서 값을 업데이트 하려면 self [: name] =을 사용할 수 있습니다.
def name
self[:name] = name_trans || self[:name]
# don't do this, it will cause endless loop
# update(name: name_trans)
end
Rails read_attribute 메소드를 사용할 수 있습니다. Rails 문서
'IT story' 카테고리의 다른 글
JSON 객체를 통해 반복 (0) | 2020.09.04 |
---|---|
파이썬 pylab 플롯 정규 분포 (0) | 2020.09.04 |
테이블 행에 테두리 반경을 추가하는 방법 (0) | 2020.09.04 |
Java에서 float이란 무엇입니까? (0) | 2020.09.04 |
현재 실행중인 프로 시저 이름 (0) | 2020.09.04 |