2011-08-25 5 views
0

이전에 만든 항목에 일 또는 시간을 추가 할 수 있어야합니다.문자열을 수학 연산으로 변환 (예 : "+2 일")

시스템은 db, : operator (더하기/빼기), : unit_of_time (시간/일) 및 : number에 저장된 속성을 기반으로 설정된 시간 수 또는 일 수를 더하거나 뺄 수 있습니다.

내가 좋아하는 뭔가를 할 수 있도록하고 싶습니다 :

Date.today+2.days 

여기서 "+"는 것입니다 : 운영자, "2"는 것입니다 : 수, "일"입니다 : unit_of_time하지만 난을 보간 된 속성 문자열을 실제 연산자 "+2days"가되는 방법을 확신 할 수 없습니다. 어떤 아이디어?

는 (필자는 루비 문서를 통해 부어했지만,/다른 블록 ... 그래가 총 있다면 아무 소용이. 현재, 난 그냥 수동으로 중첩에서 가능한 옵션 (4)로 만드는거야.)

답변

6

당신은 사용할 수 eval, 예를 들면 :

eval("Date.today+2.days") 

... 그리고 단순히 변수에 넣어 문자열 보간을 사용합니다. 그러나 데이터베이스의 값이 항상 원하는 값이라는 것을 확신 할 수있는 경우에만이 작업을 수행해야합니다. 어떠한 상황에서도 사용자가이를 변경할 수 없으면 시스템 전체를 손상시키는 주요 보안 문제가 발생할 수 있습니다.

제안한 if 진술과 같은 더 긴 방법 (또는 case 문)을 사용하면 코드를 더 작성해야하지만 훨씬 안전합니다.

+0

평가! 그게 고마워요! 예, 그 변수는 많이 테스트되었지만 블록을 더 길게 언급하면 ​​더 명확합니다. 그래서 그것은 나쁜 것이 아닐 수도 있습니다. – GoodGets

3

모든 루비 객체는 메소드를 매개 변수가있는 메소드로 실행하는 데 사용할 수있는 메소드를 가지고 있습니다. 을 사용하면을 보내고 문자열을 정수 (.to_i)로 변환하는 것으로 충분합니다.

Date.today.send '+', '1'.to_i.send('months') # This works 
Date.today.send operator, number.to_i.send(unit) # Generalized form 

루비가 아름답습니다!

+0

그게 완벽한거야! 크리스. 고마워. 나는 방법이 있다는 것을 알았습니다. 정확하게 "보내기"를 사용하는 새로운 방법은 없었습니다. Thanks – GoodGets

+1

Sweet, eval을 사용하고 싶지 않을 때 문자열의 표현식을 평가하는 데 적합합니다.''cat'.send ('==', 'dog')' –