ActiveRecord 모델의 getter 메서드를 덮어 쓰려고합니다. name
model 이라는 속성 Category
이 있으며 다음과 같은 작업을 수행하고 싶습니다.
def name
name_trans || name
end
경우 name_trans
속성이 nil이 아닌, 다음, 그렇지 않은 경우의 반환 name
속성을. 어떻게해야합니까?
그런 다음 일반적으로 다음과 같이 호출해야합니다.
@category.name
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
self[:name]
이상 read_attribute[:name]
?
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
name
이제를 호출 name_with_override
합니다. 어떤 이유로 원래 메서드를 호출하려면 name_without_override
.