IT story

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

hot-time 2020. 9. 4. 08:05
반응형

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


ActiveRecord 모델의 getter 메서드를 덮어 쓰려고합니다. namemodel 이라는 속성 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_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

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

참고 URL : https://stackoverflow.com/questions/21835116/how-can-i-overwrite-a-getter-method-in-an-activerecord-model

반응형