2014-02-17 3 views
2

블로그 포스트 끝에서 다른 임의 게시물에 티저 링크를 표시하고 싶습니다. 분명히이 링크는 현재 게시물 자체에 대한 티저가 아니어야합니다.레일 - 임의 레코드를 표시하지만 현재는 표시하지 않습니다.

나는 임의의 게시물을 선택하는 방법을 이미 알았지 만 티저 링크가 현재 게시물에 대한 링크 일 가능성은 여전히 ​​있습니다. 나는이 사건을 어떻게 제외 할 수 있는지 알 수 없었다. 나는 레일 아주 새로운 오전 난 여전히 기본적인 것들과 사투를 벌인하고

def show 
    @post = Post.find(params[:id]) 
    @staff_pickrandom = Post.where(staff_pick:true).order("RANDOM()").limit(1) 
end 

:

여기 내 컨트롤러입니다. 죄송합니다. 쉬운 방법 일 수 있습니다. 도와 주셔서 대단히 감사합니다 !!!

업데이트 : 레일 3.2 및 "friendly_id" Gem을 사용하고 있습니다.

답변

4

order('RANDOM()').limit(1)을 사용하면 DB에 임의의 레코드를 선택하게하는 것이 좋습니다. 큰 ID 세트를 가져 오는 것보다, 그리고 루비 샘플을 배열에서 보자. 해당 게시물을 제외하면 사용 where.not에 현재 포스트를 선택 방지하기 위해

Post.where(staff_pick: true).where.not(id: @post.id).order('RANDOM()').limit(1) 

또는

Post.where(staff_pick: true).where('id != ?', @post.id).order('RANDOM()').limit(1) 
+0

Thx에 대한 답변이 많습니다.귀하의 솔루션을 시도했지만 불행히도 오류가 발생합니다 : PostsController # ArgumentError - show - 잘못된 인수 수 (0은 1) – YvonC

+0

곧 시도하겠습니다. 큰 따옴표로 RANDOM()을 래핑하십시오. – blotto

+0

다시 한번 감사드립니다! 정말 감사합니다! 큰 따옴표를 사용하면 문제가 해결되지 않습니다. – YvonC

0
def show 
    @post = Post.find(params[:id]) # [1] 
    ids = Post.ids # [1, 2, 3, 4, 5] 
    ids.shuffle # [3, 5, 2, 1, 4] 
    ids.delete(params[:id]) # [3, 5, 2, 4] 
    @staff_pickrandom = Post.find(ids[0]) # [3] 
end 

거기에는 여러 가지 방법이 있습니다. 도우미를 만드는 것이 좋습니다.

+0

감사합니다. 나는 당신의 해결책으로 고민하고 있는데, 왜냐하면 나는 이것을 "where (staff_pick : true)"부분으로 사용한다. 무작위 게시물은 모든 게시물의 배열이 아닌 모든 게시물 중에서 선택됩니다. – YvonC

0

설정하려는 크기에 따라 다릅니다. 가장 쉬운입니다 Post.where(staff_pick:true)에 의해 반환 된 배열에서 임의의 객체를 선택합니다

@staff_pickrandom = Post.where(staff_pick:true).sample 

. 그 레코드가 너무 많으면 where 절에 더 많은 레코드를 추가 할 수 있습니다.

+0

제안 해 주셔서 대단히 감사합니다. 좋아 보이지만 오류가 발생합니다. 확실하지 않은 이유는 무엇입니까? NoMethodError in Posts # # 에 대해 정의되지 않은 메서드 'each'- (내 컨트롤러를 사용하면 위의 모든 내용이 제대로 작동합니다.) – YvonC

0

시도 :

@post = Post.where(staff_pick: true).where.not(id: params[:id]).shuffle.first 

where.not 경우처럼 수행 할 수 없습니다 레일즈 4, 시도 :

Post.where(staff_pick: true).where("id != ?", params[:id]).shuffle.first 

편집 : friendly_id 보석을 사용하고 있으므로 슬러그 (params [: id])와 데이터베이스의 기록 된 ID를 비교해서는 안됩니다. 먼저 찾고 싶은 게시물을 @post = Post.find(params[:id])과 같이 선언하고 위 쿼리에서 params [: id]를 삭제하고 @post.id을 대신 사용하십시오.

나는 그럴 것 같아!

+0

Diego, thanks! 레일 3.2를 사용하고 있으므로 두 번째 제안을 시도했습니다. Unfortuntaly이 오류가 발생합니다 : ActiveRecord :: StatementInvalid PostsController # show PG :: InvalidTextRepresentation : 오류 : 정수에 대한 잘못된 입력 구문 : "a-dummy-post-with-all-elements" – YvonC

+0

'friendly_id'Gem을 사용하고 있습니다. . 이것이 오류의 원인 일 수 있습니까? – YvonC

+0

그래 ... 완전히. 내가 다른 것을 써보겠습니다. 1 초. –