ActiveRecord 모델에서 getter 메서드를 어떻게 덮어 쓸 수 있습니까?


98

ActiveRecord 모델의 getter 메서드를 덮어 쓰려고합니다. namemodel 이라는 속성 Category이 있으며 다음과 같은 작업을 수행하고 싶습니다.

def name
  name_trans || name
end

경우 name_trans속성이 nil이 아닌, 다음, 그렇지 않은 경우의 반환 name속성을. 어떻게해야합니까?

그런 다음 일반적으로 다음과 같이 호출해야합니다.

@category.name

답변:



98

업데이트 : Rails 스타일 가이드 에 따라 선호되는 방법 self[:name]read_attribute및 대신 사용하는 것입니다 write_attribute. 나는 당신이 내 대답을 건너 뛰고 대신 이것을 선호하는 것이 좋습니다 .


read_attribute실제로 name 속성의 값을 가져오고 name메소드에 대한 재귀 호출을 피하는 데 사용해야한다는 점을 제외하면 정확히 그렇게 할 수 있습니다 .

def name 
  name_trans || read_attribute(:name)
end

2
Rubocop가 선호하는 이유 어떤 생각 self[:name]이상 read_attribute[:name]?
Zack Xu

18

getter 메서드를 덮어 쓰는 또 다른 옵션을 추가하고 싶습니다. 간단히 : super입니다.

def name
  name_trans || super
end

이것은 속성 getter 메소드뿐만 아니라 연관 getter 메소드에서도 작동합니다.


1
:이 레일은 현재 getter 및 setter를 들어, 추천 가이드 무엇 api.rubyonrails.org/classes/ActiveRecord/...
sandre89

5

getter를 재정의하고 사용하는 read_attribute것은 연결에 대해 작동하지 않지만 alias_method_chain대신 사용할 수 있습니다 .

def name_with_override
  name_trans || name_without_override
end

alias_method_chain :name, :override

적절한 예를 들어 주시겠습니까 ...?
Arup Rakshit

잘. 방금 도코를 봤어요 . 지금은 호출하는 경우 name모델 객체에, 어느 호출 할 것이다 - name_with_overridename_without_override?
Arup Rakshit

1
name이제를 호출 name_with_override합니다. 어떤 이유로 원래 메서드를 호출하려면 name_without_override.
Patrick Oscity

OI see .. 답장 해 주셔서 감사합니다
.//

2

이와 같은 상점 속성을 사용하는 경우

store :settings, accessors: [:volume_adjustment] 

또는 보석 링크 와 같은 보석 사용 hstore_accessor

따라서 store모델에서 메서드를 사용하게 된 다음 사용할 수없는 메서드를 재정의하려면 다음 과 같이 self.read_attribute대신 사용해야 super합니다.

def partner_percentage
  super.to_i || 10
end

0

누군가 name_transgetter 메소드에서 값을 업데이트 하려면 self [: name] =을 사용할 수 있습니다.

def name
  self[:name] = name_trans || self[:name]
  # don't do this, it will cause endless loop
  # update(name: name_trans)
end

0

Rails read_attribute 메소드를 사용할 수 있습니다. Rails 문서


이 링크는 질문에 답할 수 있지만 링크 전용 답변은 허용되지 않습니다. 해당 링크 뒤에있는 답변에 대한 컨텍스트를 추가하십시오. 감사! :)
AJT82
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.