복붙노트

[RUBY-ON-RAILS] 액티브는 레일 : 현재 사용자를 제외한 모든 사용자 찾기

RUBY-ON-RAILS

액티브는 레일 : 현재 사용자를 제외한 모든 사용자 찾기

나는 이것이 매우 간단해야한다고 생각하지만 내 뇌는 그것을 단락된다. 나는 현재 사용자를 나타내는 객체를 가지고 있고, 현재 사용자를 제외한 모든 사용자에 대한 쿼리 할 경우, 어떻게 현재 사용자가 때때로 nil이 될 수 있음을 고려하여,이 작업을 수행 할 수 있습니까?

이것은 내가 지금 뭐하는 거지 것입니다 :

def index
  @users = User.all
  @users.delete current_user
end

내가하지 같은 일은 내가 쿼리 결과에 대한 사후 처리를하고있는 중이 야한다는 것입니다. 조금 틀린 느낌 외에, 나는 will_paginate으로 실행하는 동안 쿼리를 변환 할 경우이 잘 작동합니다 생각하지 않습니다. 쿼리와 함께이 작업을 수행하는 방법에 대한 어떤 제안? 감사.

해결법

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

    1.레일 4까지에서 다음을 수행 할 수 있습니다 :

    레일 4까지에서 다음을 수행 할 수 있습니다 :

    User.where.not(id: id)
    

    당신은 좋은 범위를 포장 할 수 있습니다.

    scope :all_except, ->(user) { where.not(id: user) }
    @users = User.all_except(current_user)
    

    당신이 원하는 경우 또는 클래스 메소드를 사용합니다 :

    def self.all_except(user)
      where.not(id: user)
    end
    

    두 가지 방법은 AR 관계 객체를 반환합니다. 이것은 당신이 할 수있는 체인 메서드 호출을 의미한다 :

    @users = User.all_except(current_user).paginate
    

    ()는 배열을 곳을 받아들이 때문에 사용자의 수를 제외 할 수 있습니다.

    @users = User.all_except([1,2,3])
    

    예를 들면 :

    @users = User.all_except(User.unverified)
    

    그리고 심지어는 다른 협회를 통해 :

    class Post < ActiveRecord::Base
      has_many :comments
      has_many :commenters, -> { uniq }, through: :comments
    end
    
    @commenters = @post.commenters.all_except(@post.author)
    

    은 API 문서 도구에서 () where.not 참조하십시오.

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

    2.

    @users = (current_user.blank? ? User.all : User.find(:all, :conditions => ["id != ?", current_user.id]))
    
  3. ==============================

    3.또한 named_scope를 만들 수 있습니다, 예를 들어, 모델의 :

    또한 named_scope를 만들 수 있습니다, 예를 들어, 모델의 :

    named_scope :without_user, lambda{|user| user ? {:conditions => ["id != ?", user.id]} : {} }
    

    및 컨트롤러 :

    def index
      @users = User.without_user(current_user).paginate
    end
    

    전무와 다른 경우 PARAM에 주어진 제외한 모든 사용자를 호출 할 때이 범위는 모든 사용자를 반환합니다. 이 솔루션의 장점은 체인에 다른 이름 범위 또는 will_paginate PAGINATE 방법이 전화 무료이다.

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

    4.여기에 짧은 버전입니다 :

    여기에 짧은 버전입니다 :

    User.all :conditions => (current_user ? ["id != ?", current_user.id] : [])
    
  5. ==============================

    5.GhandaL의 대답에 하나의 참고 - 레일 3 적어도, 그것은 가치가 수정의

    GhandaL의 대답에 하나의 참고 - 레일 3 적어도, 그것은 가치가 수정의

    scope :without_user, lambda{|user| user ? {:conditions => ["users.id != ?", user.id]} : {} }
    

    (여기에서 주 변화되는 "ID = ...! 'users.id = ...!; 대신 named_scope의 범위는 레일 (3)에 대해)

    단순히 사용자 테이블을 범위 지정하면 원래 버전은 잘 작동합니다. (....) 예컨대 team.members.without_user (CURRENT_USER) 연관하여 범위를 적용하는 경우,이 변화는 우리는 ID 비교를 위해 사용하고있는 테이블 명확히 요구되었다. 나는 그것없이 (SQLite는 사용) SQL 오류를 보았다.

    사과는 별도의 답변을 ... 난 아직 GhandaL의 대답에 직접 의견을 명성이 없습니다.

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

    6.내가 사용하는 아주 쉬운 솔루션

    내가 사용하는 아주 쉬운 솔루션

    @users = User.all.where("id != ?", current_user.id)
    
  7. ==============================

    7.User.all.where ( "ID NOT IN (?)", current_user.id) 예외를 통과한다 것 여기서 정의 방법 번호 <어레이 : 0x0000000aef08f8>

    User.all.where ( "ID NOT IN (?)", current_user.id) 예외를 통과한다 것 여기서 정의 방법 번호 <어레이 : 0x0000000aef08f8>

    User.where("id NOT IN (?)", current_user.id)
    
  8. ==============================

    8.당신이 그것을 할 수있는 또 다른 쉬운 방법 :

    당신이 그것을 할 수있는 또 다른 쉬운 방법 :

    @users = User.all.where("id NOT IN(?)", current_user.id)
    
  9. ==============================

    9.배열이 더 도움이 될 것입니다

    배열이 더 도움이 될 것입니다

    arrayID [0] = 1

    arrayID [1] = 3

    User.where.not (ID : arrayID)

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

    10.User.where (: id.ne => current_user.id)

    User.where (: id.ne => current_user.id)

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

    11.당신이하고있는 것은 @users 배열에서 CURRENT_USER를 삭제합니다. 배열에 대한 삭제 방법이 아니므로이 작동하지 않습니다. 당신이 아마하고 싶은 것은 이것이다

    당신이하고있는 것은 @users 배열에서 CURRENT_USER를 삭제합니다. 배열에 대한 삭제 방법이 아니므로이 작동하지 않습니다. 당신이 아마하고 싶은 것은 이것이다

    def index
      @users = User.all
      @users - [current_user]
    end
    

    이것은 @users 어레이의 복사본을 반환하지만 CURRENT_USER 오브젝트를 제거하여 (IT는 처음에 배열에 포함시켰다.

    주 : 배열 공제가 정확한 객체의 일치가 아닌 콘텐츠를 기반으로하는 경우이 작동하지 않을 수 있습니다. 나는 그것을 시도하지만 그것은 문자열했다. 배열로 강제로 []에 CURRENT_USER를 둘러싸 기억.

  12. from https://stackoverflow.com/questions/2672744/rails-activerecord-find-all-users-except-current-user by cc-by-sa and MIT license