내 양식의 마녀가 내 데이터베이스에 없습니다 : opening_type, opening_hours, opening_minutes. 이 3 개의 필드를 사용하여 데이터베이스에서 기본 속성 "opening"을 업데이트하려고합니다.레일 - 모델에없는 속성 추가 및 모델 속성 업데이트
나는 많은 일을 시도했지만 효과가 없습니다. 사실
내가 가진 : 내가 좋아하는 뭔가를 추가하는 시도
attr_accessor :opening_type, :opening_hours, :opening_minutes
def opening_type=(opening_type)
end
def opening_type
opening_type = opening.split("-")[0] if !opening.blank?
end
def opening_hours=(opening_hours)
end
def opening_hours
opening_hours = opening.split("-")[1] if !opening.blank?
end
def opening_minutes=(opening_minutes)
end
def opening_minutes
opening_minutes = opening.split("-")[2] if !opening.blank?
end
:
def opening=(opening)
logger.info "WRITE"
if !opening_type.blank? and !opening_hours.blank? and opening_minutes.blank?
opening = ""
opening << opening_type if !opening_type.blank?
opening << "-"
opening << opening_hours if !opening_hours.blank?
opening << "-"
opening << opening_minutes if !opening_minutes.blank?
end
write_attribute(:opening, opening)
end
def opening
read_attribute(:opening)
end
단, 접근 방법은 전화를 나는 opening_type, opening_hours, opening_minutes이 너무 비어 있었다 생각되는 접근하는 경우 호출되었습니다 ...
난 before_save 콜백이 필요 없어 생각하고 접근자를 다시 작성해야합니다.
참고 : - 레일 3.0.5, - opening_type : opening_hours : opening_minutes가 비어
편집 될 수있다 : 내 코드
참고이 답변은 데이터베이스에 결합 된 'opening' 필드 만 저장한다고 가정한다고 가정합니다. 또 다른 접근법은 개별 구성 요소를 데이터베이스에 저장하고 필요에 따라 동적으로 결합 된 문자열을 작성하는 것입니다. 요구 사항에 따라 더 나은 접근 방식이 될 수도 있습니다. – Gareth
나는이 데이터베이스를 시작 필드와 함께 사용합니다. 이 데이터베이스는 스마트 폰 앱과 동기화되며 3 가지 필드를 저장하기 위해 구조를 변경할 수 없습니다. ;-) before_validation 콜백의 문제점은 폼을 편집 할 때 대소 문자를 처리하지 않는다는 것입니다. 그리고 폼의 3 개의 vars에있는 시작 필드를자를 필요가 있습니다. 나는 그것을 수동으로 할 수 있다는 것을 알고 있지만 접근자를 사용하여 더 나은 접근 방법이 있다고 생각했다 ... –
사실,하지만 'opening ='을 재정의하면 많은 일이 깨질 것이다. 또한 전달 된 매개 변수를 완전히 파기하는 setter 메서드를 사용하는 것이 매우 간단합니다. 내 작업을 명확하게하는 별도의 메서드 (예 :'set_opening ')를 사용하는 것이 좋습니다. 해당 메소드를 호출하기 위해 before_validation을 사용하지 않아도되지만 실제로는 별도의 메소드임을 권장합니다. – Gareth