복붙노트

[RUBY-ON-RAILS] 대 find_by 대 발견

RUBY-ON-RAILS

대 find_by 대 발견

나는 레일에 새로운 오전. 내가이 기록을 찾을 수있는 방법이 많이 있다는 것을 참조 :

그들 모두 정확히 같은 SQL을 생성 결국처럼 그리고 그것은 보인다. 또한, 나는 같은 여러 기록을 찾기위한 사실이라고 생각 :

어느 하나를 사용하는 엄지 손가락 또는 권고의 규칙이 있나요?

해결법

  1. ==============================

    1.당신이 당신의 요구에 가장 적합한을 느낄 중 하나를 사용합니다.

    당신이 당신의 요구에 가장 적합한을 느낄 중 하나를 사용합니다.

    찾기 방법은 일반적으로 ID에 의해 행을 검색하는 데 사용됩니다 :

    Model.find(1)
    

    항목이 사용자가 제공하는 속성에 의해 발견되지 않는 경우 발견이 예외가 발생합니다 것을주의 그것의 가치. (후술하는 바와 같이 특성이 발견되지 않는 경우, 비어있는 배열을 반환하는) 예외가 발생되지 않도록 위치를 사용한다.

    발견의 다른 용도는 대개 이런 것들로 대체된다 :

    Model.all
    Model.first
    

    find_by는 열 내에서 정보를 검색하는 도우미로 사용되며 명명 규칙과 같은 매핑됩니다. 당신이 당신의 데이터베이스의 열 이름 이름이있는 경우 예를 들어, 다음 구문을 사용하십시오 :

    Model.find_by(name: "Bob")
    

    이야기 해봐 더 당신이 기존의 헬퍼하지 않을 경우에 대한 좀 더 복잡한 논리를 사용할 수 있습니다 캐치 무엇이며, 그것은 당신의 조건 (또는 그렇지 않으면 빈 배열을)과 일치하는 항목의 배열을 반환합니다.

  2. ==============================

    2.여기서 액티브 :: 관계를 반환

    여기서 액티브 :: 관계를 반환

    이제 find_by 구현을 살펴 :

    def find_by
      where(*args).take
    end
    

    당신이 find_by 볼 수 있듯이하는 곳과 동일하지만, 그것은 단지 하나의 레코드를 반환합니다. 이 방법은 (1 개) 기록을 얻고 경우 일부 조건과 모든 레코드를 받고 사용해야 사용해야합니다.

  3. ==============================

    3.발견되지 않는 경우는 find_by가 null을 반환하는 반면, 오류를 반환합니다 찾을에서 찾기와 find_by 차이가 있습니다.

    발견되지 않는 경우는 find_by가 null을 반환하는 반면, 오류를 반환합니다 찾을에서 찾기와 find_by 차이가 있습니다.

    좁은 방 : (some_params 이메일) 어디에요 반대로, "하하"때때로 당신이 find_by 이메일 등의 방법이있는 경우 읽기 쉽습니다.

  4. ==============================

    4.Model.find

    Model.find

    1 매개 변수 : 객체의 ID를 찾습니다.

    2 만약 발견 : 그것은 객체를 반환한다 (하나의 개체 만 해당).

    3 찾을 수없는 경우 : 액티브 :: RecordNotFound 예외를 발생시킵니다.

    Model.find_by

    1 매개 변수 : 키 / 값

    예:

    User.find_by name: 'John', email: 'john@doe.com'
    

    2 만약 발견 : 그것은 개체를 반환합니다.

    찾을 수없는 경우 3 :은 nil을 반환합니다.

    참고 :이 액티브 :: RecordNotFound 사용 find_by를 제기하려면!

    Model.where

    1 매개 변수 : find_by과 동일

    2 만약 발견 : 그것은 매개 변수와 일치하는 하나 개 이상의 레코드를 포함하는 액티브 :: 관계를 반환합니다.

    3- 찾을 수없는 경우는 빈 액티브 :: 관계를 반환합니다.

  5. ==============================

    5.레일 4 이후 당신은 할 수 있습니다 :

    레일 4 이후 당신은 할 수 있습니다 :

    User.find_by(name: 'Bob')
    

    이는 레일 (3)의 등가 find_by_name이다.

    사용 #where 때 #find 및 #find_by는 충분하지 않습니다.

  6. ==============================

    6., 허용 대답은 일반적으로 모든 것을 커버,하지만 난 뭔가를 추가 할 그냥 기록을 검색하여 넣어하지 않기 때문에, 당신은 업데이트와 같은 방법으로 모델 일을 계획하고, 당신이 (id가 당신이 모르는), 그리고 find_by 갈 수있는 방법은 하나의 레코드를 검색하는 넣다 배열

    , 허용 대답은 일반적으로 모든 것을 커버,하지만 난 뭔가를 추가 할 그냥 기록을 검색하여 넣어하지 않기 때문에, 당신은 업데이트와 같은 방법으로 모델 일을 계획하고, 당신이 (id가 당신이 모르는), 그리고 find_by 갈 수있는 방법은 하나의 레코드를 검색하는 넣다 배열

    irb(main):037:0> @kit = Kit.find_by(number: "3456")
      Kit Load (0.9ms)  SELECT "kits".* FROM "kits" WHERE "kits"."number" = 
     '3456' LIMIT 1
    => #<Kit id: 1, number: "3456", created_at: "2015-05-12 06:10:56",   
    updated_at: "2015-05-12 06:10:56", job_id: nil>
    
    irb(main):038:0> @kit.update(job_id: 2)
    (0.2ms)  BEGIN Kit Exists (0.4ms)  SELECT 1 AS one FROM "kits" WHERE  
    ("kits"."number" = '3456' AND "kits"."id" != 1) LIMIT 1 SQL (0.5ms)   
    UPDATE "kits" SET "job_id" = $1, "updated_at" = $2 WHERE  "kits"."id" = 
    1  [["job_id", 2], ["updated_at", Tue, 12 May 2015 07:16:58 UTC +00:00]] 
    (0.6ms)  COMMIT => true
    

    어디 다음 사용하는 경우 그러나 당신은 직접 업데이트 할 수 없습니다

    irb(main):039:0> @kit = Kit.where(number: "3456")
    Kit Load (1.2ms)  SELECT "kits".* FROM "kits" WHERE "kits"."number" =  
    '3456' => #<ActiveRecord::Relation [#<Kit id: 1, number: "3456", 
    created_at: "2015-05-12 06:10:56", updated_at: "2015-05-12 07:16:58", 
    job_id: 2>]>
    
    irb(main):040:0> @kit.update(job_id: 3)
    ArgumentError: wrong number of arguments (1 for 2)
    

    이러한 경우에이처럼 지정해야

    irb(main):043:0> @kit[0].update(job_id: 3)
    (0.2ms)  BEGIN Kit Exists (0.6ms)  SELECT 1 AS one FROM "kits" WHERE 
    ("kits"."number" = '3456' AND "kits"."id" != 1) LIMIT 1 SQL (0.6ms)   
    UPDATE "kits" SET "job_id" = $1, "updated_at" = $2 WHERE "kits"."id" = 1  
    [["job_id", 3], ["updated_at", Tue, 12 May 2015 07:28:04 UTC +00:00]]
    (0.5ms)  COMMIT => true
    
  7. ==============================

    7.귀하의 목록에있는 두 #의 2 초는 더 이상 사용되지되고있다. 하지만 : 당신은 여전히 ​​찾기 ([ID] PARAMS)를 사용할 수 있습니다.

    귀하의 목록에있는 두 #의 2 초는 더 이상 사용되지되고있다. 하지만 : 당신은 여전히 ​​찾기 ([ID] PARAMS)를 사용할 수 있습니다.

    일반적으로, 여기서 ()는 대부분의 상황에서 작동합니다.

    여기 좋은 게시물입니다 : http://m.onkey.org/active-record-query-interface

  8. ==============================

    8.그렇다 허용 대답에서, 다음은 유효합니다

    그렇다 허용 대답에서, 다음은 유효합니다

    Model.find ()는 ID의 배열을 받아 들일 수와 일치하는 모든 레코드를 반환합니다. Model.find_by_id (123)는 또한 어레이에 동의 만 배열의 제 ID 값을 처리 할 본

    Model.find([1,2,3])
    Model.find_by_id([1,2,3])
    
  9. ==============================

    9.주어진 대답은 지금까지 모두 OK입니다.

    주어진 대답은 지금까지 모두 OK입니다.

    그러나 한 가지 흥미로운 차이점은 ID로 그 Model.find 검색입니다; 발견하면, 그것은 모델 객체 (단지 하나의 기록을) 반환하지만 그렇지 않으면 액티브 :: RecordNotFound가 발생합니다.

    Model.find_by는 Model.find과 매우 유사하고 데이터베이스에 컬럼의 열 또는 그룹을 검색 할 수 있지만 레코드가 검색 일치하지 않는 경우는 nil을 반환합니다.

    반면에 Model.where은 검색과 일치하는 모든 레코드를 포함하는 배열처럼 모델 :: ActiveRecord_Relation 개체를 반환합니다. 아무 기록이 발견되지 않은 경우는 빈 모델 :: ActiveRecord_Relation 개체를 반환합니다.

    나는이 시간에 언제든지 사용할 결정에서 당신을 도울 것입니다 바랍니다.

  10. ==============================

    10.내가 모델 사용자가 있다고 가정

    내가 모델 사용자가 있다고 가정

    반환 행 위치를 기본 키 = ID입니다. 반환 유형은 사용자 객체가 될 것입니다.

    이 경우 일치하는 속성 또는 이메일로 반환 첫 번째 행. 반환 유형은 다시 사용자 객체가 될 것입니다.

    참고 : - User.find_by (이메일 : "abc@xyz.com")가 User.find_by_email 유사하다 ( "abc@xyz.com")

    속성이 일치하는 사용자 테이블에있는 모든 사용자를 돌려줍니다.

    여기 반환 유형은 액티브 :: 관계 객체가 될 것입니다. 당신이 배열처럼의 객체를 사용하고 그것을 통과 할 수 있도록 액티브는 :: 관계 클래스는 루비의 Enumerable에서 모듈을 포함한다.

  11. ==============================

    11.나는 개인적으로 사용하는 것이 좋습니다 것입니다

    나는 개인적으로 사용하는 것이 좋습니다 것입니다

    where(< columnname> => < columnvalue>)
    
  12. from https://stackoverflow.com/questions/11161663/find-vs-find-by-vs-where by cc-by-sa and MIT license