복붙노트

[RUBY-ON-RAILS] 선택 임의 기록 레일

RUBY-ON-RAILS

선택 임의 기록 레일

난 그냥 여기에 또는 어떤 잘못된 장소에서 찾고 있어요인지는 모르겠지만, 활동 기록은 임의의 객체를 검색하는 방법이 있습니까?

같은 뭔가?

@user = User.random

아니면 ... 그 방법은 존재하지 않는 잘 때문에이 일을 몇 가지 놀라운 "레일 웨이"가, 나는 항상 장황 것으로 보인다. 나뿐만 아니라 MySQL을 사용하고 있습니다.

해결법

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

    1.레일 4에서 나는 액티브을 확장 할 것 :: 관계를 :

    레일 4에서 나는 액티브을 확장 할 것 :: 관계를 :

    class ActiveRecord::Relation
      def random
        offset(rand(count))
      end
    end
    

    당신이 범위를 사용할 수있는이 방법 :

    SomeModel.all.random.first # Return one random record
    SomeModel.some_scope.another_scope.random.first
    
  2. ==============================

    2.다음 중 하나를 선택하는 임의의 숫자를 생성하는 테이블의 행을 계산까지이 말을 내가 본 대부분의 예제. 같은 RAND ()와 같은 대안들이 실제로 모든 행을 얻고 그들에게 임의의 숫자를 할당하거나 내가 읽은 있도록 (데이터베이스 특정 내 생각)하는 것이 비효율적에이기 때문이다.

    다음 중 하나를 선택하는 임의의 숫자를 생성하는 테이블의 행을 계산까지이 말을 내가 본 대부분의 예제. 같은 RAND ()와 같은 대안들이 실제로 모든 행을 얻고 그들에게 임의의 숫자를 할당하거나 내가 읽은 있도록 (데이터베이스 특정 내 생각)하는 것이 비효율적에이기 때문이다.

    당신은 내가 여기에있는 것과 같은 방법을 추가 할 수 있습니다.

    module ActiveRecord
      class Base
        def self.random
          if (c = count) != 0
            find(:first, :offset =>rand(c))
          end
        end
      end
    end
    

    이것은 당신은 내가 위에서 설명한 방식으로 작동하는 임의라는 메소드가 사용하는 모델 있도록 할 것입니다 : 테이블의 행의 수에서 난수를 생성하고, 그 임의의 숫자와 관련된 행을 가져옵니다. 그러니까 기본적으로, 당신은 단지 하나가 아마 당신은 무엇을 선호되는 인출하고있는 :)

    이 플러그인을 레일에서 또한 좀 걸릴 수 있습니다.

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

    3.우리는 오프셋이 큰 테이블을 위해 MySQL을 매우 느리게 실행 것으로 나타났다. 대신이 같은 오프셋 사용 :

    우리는 오프셋이 큰 테이블을 위해 MySQL을 매우 느리게 실행 것으로 나타났다. 대신이 같은 오프셋 사용 :

    model.find(:first, :offset =>rand(c))
    

    ... 우리는 다음과 같은 기술이 빠르게보다 10 배 (1으로 해제 고정) 실행 발견

    max_id = Model.maximum("id")
    min_id = Model.minimum("id")
    id_range = max_id - min_id + 1
    random_id = min_id + rand(id_range).to_i
    Model.find(:first, :conditions => "id >= #{random_id}", :limit => 1, :order => "id")
    
  4. ==============================

    4.배열의 샘플 방법을 사용해보십시오 :

    배열의 샘플 방법을 사용해보십시오 :

    @user = User.all.sample(1)
    
  5. ==============================

    5.나는 명명 된 범위를 사용하십시오. 그냥 사용자 모델에이 던져.

    나는 명명 된 범위를 사용하십시오. 그냥 사용자 모델에이 던져.

    named_scope :random, :order=>'RAND()', :limit=>1
    

    랜덤 함수는하지만 각 데이터베이스에서 동일하지 않습니다. SQLite는 다른 사람은 RANDOM ()를 사용하지만 당신은 MySQL을 위해 RAND ()를 사용해야합니다.

    하나 개 이상의 임의의 행을 잡을 수 있도록하고 싶습니다 경우이 작업을 시도 할 수 있습니다.

    named_scope :random, lambda { |*args| { :order=>'RAND()', :limit=>args[0] || 1 } }
    

    당신이 User.random를 호출하는 경우는 1로 설정됩니다하지만 당신은 하나 이상 원하는 경우 당신은 또한 User.random (3)을 호출 할 수 있습니다.

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

    6.당신이 임의의 기록을해야하지만 특정 조건 내에서 사용할 수 있다면이 코드에서 "random_where"

    당신이 임의의 기록을해야하지만 특정 조건 내에서 사용할 수 있다면이 코드에서 "random_where"

    module ActiveRecord
      class Base
        def self.random
          if (c = count) != 0
            find(:first, :offset =>rand(c))
          end
        end
    
        def self.random_where(*params)
          if (c = where(*params).count) != 0
            where(*params).find(:first, :offset =>rand(c))
          end
        end
    
      end
    end
    

    예컨대는 경우 :

    @user = User.random_where("active = 1")
    

    이 기능은 몇 가지 추가 기준에 따라 무작위로 제품을 표시하는 데 매우 유용합니다

  7. ==============================

    7.강력 특별히 데이터 행이 많은 테이블을 위해 설계 임의 기록이 보석을, 추천 :

    강력 특별히 데이터 행이 많은 테이블을 위해 설계 임의 기록이 보석을, 추천 :

    https://github.com/haopingfan/quick_random_records

    간단한 사용법 :

    @user = User.random_records (1) .take

    모든 다른 답변이 보석을 제외하고 대형 데이터베이스와 심하게 수행

    참고 : 내 테이블은 12 만 사용자를 가지고있다. 당신이 더 많은 기록은 성능의 더 엄청난 차이가있을 것입니다.

    최신 정보:

    550,000 행이 테이블에 수행

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

    8.다음은 데이터베이스에서 무작위로 기록을 얻기를위한 최적의 솔루션입니다. RoR에 사용의 용이성 모든 것을 제공합니다.

    다음은 데이터베이스에서 무작위로 기록을 얻기를위한 최적의 솔루션입니다. RoR에 사용의 용이성 모든 것을 제공합니다.

    DB 사용 샘플에서 무작위로 기록을 얻기 위해, 아래의 예와 그에 대한 설명입니다.

    마크 - 앙드레 Lafortune의 github.com/marcandre/backports/ 반환 임의의 요소 또는 배열에서 n은 임의의 요소에 따라 배열 # 샘플의 백 포트. 배열이 비어 n은 전무 경우,은 nil을 반환합니다. n이 전달되고 그 값이 0보다 작은 경우 ArgumentError 예외를 제기한다. N의 값과 같거나 0보다 큰 경우는 리턴 [].

    [1,2,3,4,5,6].sample     # => 4     
    [1,2,3,4,5,6].sample(3)  # => [2, 4, 5]     
    [1,2,3,4,5,6].sample(-3) # => ArgumentError: negative array size     
    [].sample     # => nil     
    [].sample(3)  # => []     
    

    당신은 당신의 요구 사항에 따라 다음과 같은 예와 조건을 사용할 수 있습니다.

    User.where (활성 : TRUE) .sample (5)

    그것은 사용자 테이블에서 무작위로 5 활성 사용자의 반환합니다

    더 많은 도움 바랍니다 보려면 다음 사이트를 방문하십시오 : http://apidock.com/rails/Array/sample

  9. from https://stackoverflow.com/questions/3641057/rails-select-random-record by cc-by-sa and MIT license