2012-12-12 4 views
0

사용자 배열 값을 사용하여 변수를 반환하려고합니다. 충족되어야하는 몇 가지 조건이 있습니다. 사용자는 public_findtrue으로 설정해야하며 current_user (현재 로그인 한 사용자의 세션 변수)이 아니어야하며 우정의 일부가 아니어야합니다. 첫 번째와 두 번째 조건은 완벽하게 작동합니다. 그러나 세 번째 부분에 문제가 있습니다. 여기서 current_users.friendships은 연관이 이미있는 사용자의 ID 값의 배열이어야합니다. 이견있는 사람?배열에 조건이없는 모든 일치 조건을 찾습니다.

@users = User.find(:all, :conditions => [' 
    public_find=true AND 
    id <> ? AND 
    id NOT IN (?)', 
    current_user.id, current_user.friendships]) 

편집 :

나는 목록에서 뽑은 누락 된 것을 알아 냈어요. 이것은 잘 작동합니다. 그러나 누군가 아직 친구가없는 경우 current_user.friendships.pluck(:friend_id)NULL을 반환합니다. 나는 나쁜 습관이고 NOT INNULL을 사용할 때 예기치 않은 결과가 반환된다는 것을 알고 있습니다. 그러나 반환 된 배열이 비어있는 경우 값을 [0] 또는 [1]과 같은 실제 값으로 설정할 수있는 조건을 어떻게 만듭니 까? 다시

@users = User.find(:all, :conditions => [' 
    public_find=true AND 
    id <> ? AND 
    id NOT IN (?)', 
    current_user.id, current_user.friendships.pluck(:friend_id) || [0]]) 

편집 :

내가 작업을 얻었다. 그러나 이제는 이와 같은 진술을하는 것이 가장 좋은 방법인지 알고 싶습니다. 기본적으로 current_user.friendships.pluck(:friend_id)이 비어 있는지 확인하기 위해 검사하고 있습니다. 그렇다면 [0]을 반환합니다. 그 이외의 경우는, 유저 식별자의 배열을 돌려줍니다 (foreign keyed는 friend_id).

@users = User.find(:all, :conditions => [' 
    public_find=true AND 
    id <> ? AND 
    id NOT IN (?)', 
    current_user.id, 
    (current_user.friendships.pluck(:friend_id).empty? ? [0] : current_user.friendships.pluck(:friend_id))]) 

답변

1

당신은

표시 public_find 사실이며, 또한 현재 로그인 한 사용자 또는 친구

ids = current_user.friendships.map(&:friend_id).concat([current_user.id]) 
@users = User.where(:public_find => true).where('id not in ?', ids) 
1

내가 사용하는 것 중 제외되는 모든 사용자를 ..이 조금 더 좋은 기록 할 수 있습니다 이에 대한 arel 테이블 (코드가 모든 데이터베이스에서 작동 함을 보장 함) :

Generat 에드 current_user = 3에 대한 SQL 및 id = 1이있는 사용자와 하나의 우정 : current_user.friendshipsnil입니다

SELECT "users".* FROM "users" 
WHERE ("users"."public_find" = 't' AND "users"."id" != 3 AND "users"."id" NOT IN (1)) 

경우는 SQL에 표시되지 않습니다, 그래서 unless f.empty? 절은 전혀 적용되는 해당 조건을 방지 할 수 있습니다 :

SELECT "users".* FROM "users" 
WHERE ("users"."public_find" = 't' AND "users"."id" != 3) 

또한이 코드 where 대신 find 사용하기 때문에, 최종 결과가 ActiveRecord::Relation보다는 결과의 배열되어 있습니다. 즉, 조건을 추가로 연결할 수 있습니다. 결과를 updated_at으로 주문하려면 마지막 행을 다음으로 변경하십시오.

@users = User.where(query).order(:created_at) 
관련 문제