where와 find_by/find의 차이

드 기초이지만, Rails의 ActiveRelation에 핀으로 오지 않았을 무렵에, 몰랐던 이야기.
선배님이 채팅으로 빨리 설명하고 있을 정도! 라고 생각했으므로 남겨 둡니다

User.where(id: 1)과 User.find_by(id: 1)/User.find(1)의 차이점



둘 다 DB에서 데이터를 가져오고 싶은 처리인 것은 확실하다. 구체적으로 어떻게 다른가?
where 쪽은, 복수 조건을 붙여 찾을 수 있는, 같은 흐릿한 차이 밖에 머리에 들었다.

where를 사용하는 경우



where 절을 사용하면 항상 ActiveRelation이므로 지연 평가가 수행됩니다.
즉, 즉시 SQL문이 발행되어 실행되는 것은 아니다.
돌려주어지는 값의 클래스는, ActiveRecord_Relation 가 된다.
[1] pry(main)> User.where(id: [1])
#=> [#<User id: 1, email: "[email protected]", created_at: "2017-03-30 01:56:31", updated_at: "2017-06-20 04:50:23"] 
[7] pry(main)> User.where(id: 1).class
=> User::ActiveRecord_Relation

find_by 또는 find를 사용하는 경우



즉시 SQL을 실행하여 객체 자체를 반환합니다.
돌려주어지는 값의 클래스는, 여기에서는 User 가 된다. 즉시 SQL이 실행되고 있음을 알 수 있습니다.
[1] pry(main)> User.find_by(id: 1)
#=> [#<User id: 1, email: "[email protected]", created_at: "2017-03-30 01:56:31", updated_at: "2017-06-20 04:50:23"] 

[2] pry(main)> User.find(1)
#=> [#<User id: 1, email: "[email protected]", salt: nil, created_at: "2017-03-30 01:56:31", updated_at: "2017-06-20 04:50:23"] 

[3] pry(main)> User.find_by(id: 1).class
  User Load (0.5ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
=> User(id: integer, email: string, created_at: datetime, updated_at: datetime)

[3] pry(main)> User.find(1).class
  User Load (0.5ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
=> User(id: integer, email: string, created_at: datetime, updated_at: datetime)


참고



이 사람의 설명은 알기 쉽다.
h tps : // s t c ゔ ぇ rf ぉ w. 코m/아/9574674

좋은 웹페이지 즐겨찾기