find_or_initialize_by 놀라는 행동을 잊지 않기 위해 남겨두다
4881 단어 Rails
이 기사로 쓰겠습니다.
Rails 가이드 | findor_initialize_by의 행동은 사람을 놀라게 하니 잊지 마세요.
구체적으로 말하면
find_or_initialize_by
의 매개 변수 값이nil일 때의 행위.예제
params[:name]
는 nil
를 포함할 수 있다.User.name
uniq제약이 있습니다.user = User.find_or_initialize_by(name: params[:name])
이 때 어떤 ql가 발매됩니까?param[:name]은nil이 아니라name에 이미 존재하는 인자name의 기록입니다
# params[:name] は `test_user` だとする。
User Load (1.1ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'test_user' LIMIT 1
존재하는 기록을 되돌려줍니다.param[:name]이 nil이 아니고name에 인자가 없는name의 기록이 있을 때
# params[:name] は `hoge` だとする。
User Load (2.7ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hoge' LIMIT 1
발행된 sql와 같이 되돌아오는 값은 id가 없는 user.name
기록hoge
입니다.param[:name]이nil인 경우
# params[:name] は `nil` だとする。
User Load (2.7ms) SELECT `users`.* FROM `users` WHERE `users`.`name` IS NULL LIMIT 1
당연한 일이긴 하지만 name
에 가입 가치가 없는 기록의 첫 번째 일이 돌아왔다.닐이 무단으로 들어갔을 때 오류가 발생하거나 기존 기록을 반납하지 않고 새로운 실례를 만들어 좋은 해석이 기대되지만 환상이다.
전혀 의도하지 않은 기록을 갱신할 수도 있다.
find_or_initialize_by
파라미터를 고려하지 않고nil이 들어갈 수 있는 처리가 위험하다는 것을 발견했다읽다
# File activerecord/lib/active_record/relation.rb, line 226
def find_or_initialize_by(attributes, &block)
find_by(attributes) || new(attributes, &block)
end
우선 nil
도 좋은 가격이니 find_by
도 잘 들어가세요.나는 이 점을 이해했다.find_or_create_by도 마찬가지로 주의해야 한다.
# 意図してないけど、nilが入ってしまった。。。。。。。
new = User.find_or_create_by(name: nil)
User Load (5.3ms) SELECT `users`.* FROM `users` WHERE `users`.`name` IS NULL LIMIT 1
총결산
"어!! 어떤 음반이 무단으로 업데이트됐는지 모르겠다!!!"
이러한 고민을 해소하기 위해서는 머릿속의 편리한 해석을 멈추고 자신의 행동을 잘 확인해 보세요.
나는 닐이 의도적으로 사용한 것 이외에 모두 매개 변수에 포함되지 않는다고 생각한다.
Reference
이 문제에 관하여(find_or_initialize_by 놀라는 행동을 잊지 않기 위해 남겨두다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/xxl/items/11dbe1b5ccf35b5a99e5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)