find_or_initialize_by 놀라는 행동을 잊지 않기 위해 남겨두다

4881 단어 Rails

이 기사로 쓰겠습니다.


Rails 가이드 | findor_initialize_by의 행동은 사람을 놀라게 하니 잊지 마세요.
구체적으로 말하면 find_or_initialize_by의 매개 변수 값이nil일 때의 행위.

예제

params[:name]nil를 포함할 수 있다.User.nameuniq제약이 있습니다.
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

총결산


"어!! 어떤 음반이 무단으로 업데이트됐는지 모르겠다!!!"
이러한 고민을 해소하기 위해서는 머릿속의 편리한 해석을 멈추고 자신의 행동을 잘 확인해 보세요.
나는 닐이 의도적으로 사용한 것 이외에 모두 매개 변수에 포함되지 않는다고 생각한다.

좋은 웹페이지 즐겨찾기