2014-12-29 3 views
0

valuedisplay_value 열이있는 다형 lookups 테이블이 있습니다. HTML select 양식 요소가 작동하는 것과 마찬가지로 value은 DB에 저장되는 내용이고 display_value은 화면에 표시되는 내용으로 "꽤"보이게합니다.레일 4 : 조회 값 표시

display_value이없는 경우 조회의 기본값은 value입니다. 그렇게하면 코드에서 항상 display_value을 사용할 수 있지만 nil 오류가 발생하지만 실제로는 value 만 DB에 필요합니다.

다음 코드는이 문제를 해결하지만 이와 같이 간단한 "약간 자세한"것으로 보입니다. Ruby/Rails를 더 명확하고 간결하게 코딩하여 아직 의도를 전달하는 방법이 있습니까? 이 약으로 분명하다

read_attribute(:display_value) || value

# models/lookup.rb 
class Lookup < ActiveRecord::Base 
    validates :type, presence: true 
    validates :value, presence: true 

    # If display_value present, display it or default to value 
    def display_value 
    value_to_display = read_attribute(:display_value) 
    if value_to_display.blank? 
     value 
    else 
     value_to_display 
    end 
    end 
end 

갱신 2014년 12월 29일 11시

나는이 질문 불과 몇 분 후에 그것은 나를 때리는 ... 그리고 내가 생각할 수있는 것처럼 간결하게. 이보다 더 좋은 해결책이 있습니까? 당신이 무엇을

답변

0

예는, 가장 간결하다 : 당신은 더 나은 솔루션을 요구하기 때문에, 또한

super || value 

:

read_attribute(:display_value) || value 

난 당신이 메서드의 이름 display_value을 유지하는 경우 다음도 작동합니다 생각 :

display_value 값을 데이터베이스에 실제로 저장해야합니까?

데이터베이스에 value을 저장하고 상수를 사용하는 display_value 메서드를 만듭니다. 예를 들어

:

class Lookup < ActiveRecord::Base 
    DISPLAY_VALUES = { 
    # add keys and values 
    } 

    def display_value 
    DISPLAY_VALUES[self.value] || self.value 
    end 
end 

그러나 곧 뷰 특정 방법의 혼란을 만들 수 있습니다 모델에서 이러한 방법을 추가. 그러한 방법은 도우미에 있어야합니다. 또는 앱에 장식자가있는 경우 데코레이터.

간단히 말해서 데코레이터는 각 모델의 클래스입니다. 이 클래스에서는 display_value과 같은보기 특정 메서드를 만듭니다.

그러나 사용자가 입력 한 내용에 대해 value (액센트가없는 문자열) 및 display_value을 모두 저장하는 경우에는 무시하십시오.

+0

DB에 display_value를 저장하는 이유는 화면의 텍스트를 사용자가 변경할 수 있기 때문에 로직 비하인드가 변경되지 않기 때문입니다. 예를 들어, 사용자는 화면에서 "관리자"대신 "관리자"를보고 싶지만 코드의 논리는 동일합니다. 그것들을 키/값으로 저장하는 것은 실행 가능한 옵션이지만 코드 푸시 (DB 레코드 업데이트)없이 display_value를 변경할 수있는 유연성이 필요합니다.필자는 데코레이터에 익숙하지만 display_value는 레코드 자체와 밀접하게 연결되어 있으므로 실제 열 값이므로 모델에 보관해야합니다. –