[code type=ruby][/code]개발 중인 Project에서 ActiveRecord::Base#find 문이 조금 복잡하게 구성이 되야 한다.
그래서 find 문에서 hash 값으로 넘어가는 options 부분을 분리하여, 처리한뒤 find문에 전달한다.
예를 들면
[code type=ruby]
find_options = {}
find_options[:select] = Post::COLUMNS # Constant
find_options[:conditions] = ...
if query
find_options[:conditions][0] << [' AND title LIKE ?', '%'+query+'%']
find_options[:conditions] << query
end
[/code]
위와 같이 코드를 구성하면, 복잡한 조건에 대해서도 깔끔하게 코드를 정리할 수 있다.
그런데 어떤 경우에 hash의 값으로 엉뚱한 값이 들어가 있는 버그가 발견되었다.
디버깅 결과, Constant를 할당하는 부분에서 발생되는 것이었다. 결론부터 말하면
hash의 값으로 Constant를 전달하고, String#<< (Append method)로 값을 추가하면
Constant의 값이 바뀐다. 이는 변수에 전달한 경우도 마찬가지다.
[code type=ruby]
> CONST = '1, 2, 3'
> hsh = {}
> hsh[:test] = CONST
> hsh[:test] << ', 4, 5' # => 'warning도 없이 깔끔하게(^^;) 추가됨.
> puts CONST
'1, 2, 3, 4, 5'
> hsh[:test] += ', 6'
warning: already initialized constant CONST
[/code]
따라서 위와 같은 경우를 방지하기 위해서, Constant를 할당한 경우는 += 로 String을 추가해야 한다.
그래서 find 문에서 hash 값으로 넘어가는 options 부분을 분리하여, 처리한뒤 find문에 전달한다.
예를 들면
[code type=ruby]
find_options = {}
find_options[:select] = Post::COLUMNS # Constant
find_options[:conditions] = ...
if query
find_options[:conditions][0] << [' AND title LIKE ?', '%'+query+'%']
find_options[:conditions] << query
end
[/code]
위와 같이 코드를 구성하면, 복잡한 조건에 대해서도 깔끔하게 코드를 정리할 수 있다.
그런데 어떤 경우에 hash의 값으로 엉뚱한 값이 들어가 있는 버그가 발견되었다.
디버깅 결과, Constant를 할당하는 부분에서 발생되는 것이었다. 결론부터 말하면
hash의 값으로 Constant를 전달하고, String#<< (Append method)로 값을 추가하면
Constant의 값이 바뀐다. 이는 변수에 전달한 경우도 마찬가지다.
[code type=ruby]
> CONST = '1, 2, 3'
> hsh = {}
> hsh[:test] = CONST
> hsh[:test] << ', 4, 5' # => 'warning도 없이 깔끔하게(^^;) 추가됨.
> puts CONST
'1, 2, 3, 4, 5'
> hsh[:test] += ', 6'
warning: already initialized constant CONST
[/code]
따라서 위와 같은 경우를 방지하기 위해서, Constant를 할당한 경우는 += 로 String을 추가해야 한다.



::: 사람과 사람의 교감! 人터넷의 첫 시작! 댓글을 달아주세요! :::