2009-09-07 2 views
0

User.not_in_project(project)과 같은 명명 된 범위를 만들려고하는데 올바른 방법을 찾을 수 없습니다.복잡함 named_scope : 특정 프로젝트에 속하지 않은 사용자 찾기

나는 사용자, 프로젝트 및 업무 조인을 모델로이 :이 찾아 절에 named_scope 유사과 노력

class User < ActiveRecord::Base 
    has_many :duties, :extend => FindByAssociatedExtension 
    has_many :projects, :through => :duties 
end 

class Duty < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :project 
end 

class Project < ActiveRecord::Base 
    has_many :duties 
    has_many :users, :through => :duties 
end 

:

User.all(:joins => :duties, :conditions => ['duties.project_id != ?', my_project]) 

그러나 그 날 사용자에게 반환하지 않습니다 누가 my_project을 가지고 있지 않지만 my_project 이외의 프로젝트를 가진 사용자. 즉

, 나는 명명 된 범위는 정확히이 방법처럼 행동 할 :

def self.not_present_in p 
    self.all.reject{|u| u.projects.include?(p)} 
end 

내가 어떻게 할 수 있습니까?

+0

돌아 오시겠습니까? 나는 이것에 대해 명확하지 않다. –

+0

정확하게이 메서드와 똑같이 동작하는 명명 된 범위를 원합니다. def self.not_present_in p self.all.reject {| u | u.projects.include? (p)} end Project를 인수로 전달하지 않은 사용자를 반환하고 싶습니다. 이 정보가 도움이 되셨습니까? –

+0

소스 코드가 들어 있기 때문에 위의 설명을 포함하도록 질문을 편집했습니다. –

답변

1

SQL에서 생각 쿼리가 같은 것을해야한다 :

select id 
    from users 
where id not in (select id 
        from users join duties on users.id = duties.user_id 
        join projects on duties.project_id = projects.id 
        where projects.id = %) 

을하지만 그것이 named_scope 사용하여 어떻게 작동하는지 너무 확실하지 않다. 나는 비슷한 것을 사용한다고 말하고 싶다.

def self.not_present_in p 
    find_by_sql ["select id from users where id not in (select id from users join duties on users.id = duties.user_id join projects on duties.project_id = projects.id where projects.id = ?)", p] 
end 

AR을 사용하는 것만 큼 그리 좋지는 않지만 작동 할 것이다.

+0

감사합니다 Yaraher, 당신이 제공하는 SQL 쿼리가 작은 수정으로 원하는대로 작동합니다. 모호하지 않게 두 번째 선택 후 "id"를 "users.id"로 대체해야했습니다. 그러나, 나는. named_scope :(에서 –

+0

을 find_by_sql을 사용할 수 없습니다 그런데 왜 당신이 그것을 명명 된 범위를해야합니까? 다른 방법으로 병합 들어? 을 그런 경우가 아니라면, 그것은. 을 잘 작동해야하고 조금 후에 수정하고 싶다면 AR이 사용하는 방법과 비슷한 옵션 해시를 제출하고 find_by_sql 쿼리와 병합/병합하면됩니다. 약간의 추가 작업이있을 수 있지만 거의 비슷한 것입니다. ORM은 항상 SQL을 사용하지 못하게합니다 :) – Yaraher