2015-02-02 4 views
1

에 두 개의리스트, 루비를 병합합니다. "무작위 합병"을 원합니다. 즉, 두 번째 목록의 각 요소가 처음 위치의 첫 번째 목록과 병합됩니다.내가 두 개의 목록이 레일

첫 번째 컬렉션의 항목은 상대 순서를 유지해야합니다.

+2

FYI : '='이 아닌 연산자가 필요한 경우에만 변수 보간을 사용하십시오. 이 경우'state : 'new'와'state : 'old''를 사용하십시오. – meagar

+0

'ctr'은 정수입니까? – Stefan

+0

@Stefan 예, ctr 정수 –

답변

1

아마도 대용량 배열에는 그리 효율적이지 않지만 "임의"위치에있는 "새"배열의 각 항목을 (정렬 된) "이전"배열에 삽입 할 수 있습니다. 뭔가 같이 :

sorted = Content.where(state: 'old').order('ctr DESC').to_a 
others = Content.where(state: 'new') 

others.each { |item| sorted.insert(rand(0..sorted.size), item) } 

여기에 실제 데이터 예는 다음과 같습니다

10.times do 
    sorted = (1..10).to_a 
    others = %i(foo bar baz) 
    others.each { |item| sorted.insert(rand(0..sorted.size), item) } 
    p sorted 
end 

출력 :

[:bar, 1, 2, 3, 4, 5, 6, 7, :foo, 8, 9, 10, :baz] 
[1, 2, :bar, 3, 4, :baz, 5, 6, 7, 8, 9, 10, :foo] 
[1, 2, 3, 4, 5, 6, :foo, :bar, 7, 8, 9, :baz, 10] 
[1, 2, 3, 4, 5, 6, :foo, :bar, 7, 8, :baz, 9, 10] 
[1, 2, 3, 4, :foo, 5, :baz, 6, 7, :bar, 8, 9, 10] 
[1, :baz, 2, 3, 4, 5, :foo, 6, 7, 8, :bar, 9, 10] 
[:foo, 1, 2, 3, 4, 5, :bar, :baz, 6, 7, 8, 9, 10] 
[1, 2, 3, 4, 5, 6, 7, :baz, :bar, 8, 9, :foo, 10] 
[1, 2, 3, 4, 5, 6, :bar, :foo, :baz, 7, 8, 9, 10] 
[1, 2, 3, 4, 5, :bar, 6, :foo, 7, 8, 9, 10, :baz] 
+0

결과가 배열입니까? –

+1

@AlexIvanov 'others'의 요소가'sorted' 배열에 삽입되고 그 결과가됩니다. 그래서 예, 결과 ('sorted')는 배열입니다. – Stefan

3

왜 단지

Content.where(state: ['old','new']).order('RAND()') 

당신은 그것을 하나 개의 쿼리를 싶어하지 임의의 순서로 어느 쪽이든, 그래서 종류 및


확인 종류 다음 '을 정렬 해제가'여기에 새 정보에 따라 내 생각이 왜, 트릭 병합

content_old = Content.where(state: 'old') 
content_new = Content.select('*, RAND() as ctr').where(state: 'new') 
@random_content = (content_old+content_new).sort_by(&:ctr).reverse 
에 대해 귀찮게하지 않고 다음, 임의의 클릭률 (CTR)과 두 번째 목록을 작성하여 한 번 정렬을하는 것입니다

이것은 정말로 ctr 값이 필요하지 않은 경우에만 작동합니다. 임의의 값을 메모리의 일부 레코드에 추가하기 때문에 데이터베이스에서 안전합니다.이 경우 readonly과 같은 호출을 할 수 있으므로 조심해야합니다. :

content_new = Content.readonly.select('*, RAND() as ctr').where(state: 'new') 

RAND()doc page을 읽을 수 있습니다. RAND()의 시작과 끝을 설정하는 방법을 보여주는 기능이 있습니다.

+2

첫 번째 컬렉션의 항목은 상대 순서를 유지해야합니다. –

+1

아하 그렇습니다. 명확하지 않기 때문에 질문에 추가 할 수 있습니까? –

+0

고정 된'ctr '값이 고르게 분포되어 있고 모든'ctr '값이 다른 경우에만 작동합니다 (임의로 생성 할 수 없습니다 값은 '2'와 '2'사이에 있음). – Stefan

관련 문제