2

는 모델의 사용자를 고려레일스 모델에서 필드를 "오버로드"하는 가장 좋은 방법은 무엇입니까?

내가 응용 프로그램을 구축
User(id: integer, name: string, email: string, status: string) 

, 상태는 데이터베이스의 필드했다. 그러나 새로운 요구 사항은 어떤 경우에는 상태가 동적으로 계산되도록 변경을 의미합니다. 예를 들어, 일요일에 성이 A로 시작하면 상태가 "not ok"입니다.

나는 다음과 같은 같은 뭔가 사용자 모델에서이 기능을 캡슐화 할

:

Class User < ActiveRecord::Base 

    def status 
    if is_sunday && last_name.starts_with('A') 
     return 'not ok' 
    else 
     return status 
    end 
    end 

end 

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 위의 코드가 작동하면 데이터베이스의 필드를 메서드로 재정의하는 것이 좋지 않은 것처럼 보입니다.

또는 위의 코드를 사용하려면 get_status 메서드를 만들 수 있습니다. 그러나이 경우 응용 프로그램 전체에서 모든 참조를 status으로 변경해야합니다. 그건 좋은 것 같지 않아.

+2

fwiw, 나는 해결책으로 그 방법으로 완전히 괜찮습니다. 나는'get_status'를 추가하는 것이 사용자의 상태를 검색하는 두 번째 방법을 만들기 때문에 좀 더 혼란 스럽다고 생각합니다. – thewillcole

답변

4

ActiveRecord::Base documentation에서 ActiveRecord에서 제공하는 기본 접근자를 무시할 수 있음을 확인했습니다. 물론 status을 사용하면 메서드를 다소 재귀 적으로 사용할 수 있기 때문에 사용할 수 없습니다.

원하는 경우 read_attribute(:attribute_name) 또는 self[:attribute_name]을 사용하여 DB의 열 값에 액세스 할 수 있습니다. 그래서 길고도 짧은 이야기, 당신의 접근이된다 :

Class User < ActiveRecord::Base 
    def status 
    if is_sunday && last_name.starts_with('A') 
     'not ok' 
    else 
     read_attribute(:status) 
    end 
    end 
end 

UPDATE : 나는 그것을 시도하고 당신이 DB의 콘텐츠를 명시 적으로이 메소드를 호출하지 않으면 때문에이 있지만, 관심을 지불 작품 ... 대한 예를 들어 users 테이블을 쿼리하여 status = "not ok" 사용자를 찾으면 놀라움을 가질 수 있습니다.

+1

Rails 3.2에서'read read_attribute (: status)'를'super '로 바꾸는 것이 당신을 위해합니까? – Zabba

+0

'super'는 이전 Rails 버전에서도 Ruby의 핵심 작업이므로 작동해야합니다.하지만이 문맥에서는 다소 모호한 것으로 보입니다. 나는 이것을 명백하게하는 것을 선호 할 것이다. –

+1

+1, 신고서가 필요합니까? – stephenmurdoch

관련 문제