2010-03-27 5 views
0

다음과 같은 모델 설정이 있습니다 - 사용자가 많은 프로젝트의 프로젝트에 관심이 있습니다 카테고리. 각 프로젝트에는 많은 범주가 있습니다. 그래서 같이 : 사용자가 프로젝트 카테고리 A, B에 관심이 있다면 지금레일즈 활성 레코드 - 고급 찾기

class User 
    has_many :projects 
    has_and_belongs_to_many :project_categories 

class Project 
    belongs_to :user 
    has_and_belongs_to_many :project_categories 

class ProjectCategory 
    has_and_belongs_to_many :projects 
    has_and_belongs_to_many :users 

, 내가 특정 사용자, 즉 관심있는 catogories 의와 프로젝트에 대한 발견을하고 싶습니다, C를 누른 다음 해당 프로젝트 범주 중 하나 이상의 프로젝트 부분을 찾고 싶습니다.

누구나?

답변

0

도움을 주셔서 감사합니다! 지금 당장은 너무 열정적 인 멍청한 마음으로 모든 가능한 AR 솔루션을 다 통과하지는 못했지만 피에르 (Pierre)가 말한 것처럼 AR이 추상화되면 브레이크가 걸리는 것이 흥미로울 것입니다. 나는 랜디의 제안을 수정 한 버전으로 갔다 :

pids = Project.find_by_sql ["SELECT project_id FROM project_categories_projects JOIN project_categories_users ON project_categories_projects.project_category_id = project_categories_users.project_category_id WHERE user_id = ?", current_user.id] 
mytags_projects = Project.find(pids.collect(&:project_id), :limit => 10, :order => "created_at DESC") 
0

나는 ActiveRecord 추상화가 새는 또 다른 사례라고 생각한다. 이 작업을 수행하려면 약간의 SQL이 필요할 것이다.

1

먼저 JOIN을 사용하여 주어진 사용자 ID에 대한 모든 프로젝트 ID를 찾습니다.

# This will give me the list of project ids for the categories that a user is interested in. 
project_ids = Project.find("SELECT project_id FROM projects_project_categories JOIN project_categories_users ON project_categories_users.project_category_id = projects_project_categories.project_category_id WHERE project_categories_users.user_id = ?", user_id) 

# Now that I have the list of ids I can do a simple primary key lookup. Each project object returned only has the project_id attribute populated since we only asked for the project_id above. 
projects = Project.find(project_ids.collect(&:project_id)) 

나는 이것이 당신이에서 작업을 수행 할 수 있습니다 쿼리의 최소 수라고 생각합니다.

위 당신의 테이블을 조인 projects_project_categories 및 project_categories_users이라고 가정합니다. 또한 실제로 이것을 테스트하지는 않았습니다.

+0

나는 약간의 독서를해야 할 것이다. 내 콘솔 테스트에서 오류 출력 (494281354는 사용자 ID 임). --- SELECT * FROM'projects' WHERE ('projects'.'id' IN (0,494281354)) ActiveRecord :: RecordNotFound : ID가있는 모든 프로젝트를 찾을 수 없습니다 (0,494281354) (결과가 0 개가 있음 , 찾고 있었지만 2) – par

+0

위의 코드에서 우리가 ID 목록을 얻은 후에 프로젝트를 조회하는 오타가 있음을 알았습니다. 다시 시도하고 어떻게 진행되는지 알려면 해결했습니다. –

1

이렇게하려면 SQL이 필요하지 않습니다. AR의 bult-in : include 함수를 사용할 수 있습니다.

project = Project.find(:include => [:user, :project_categories], :conditions => {:user_id => user_id, :project_category_id => [A,B,C,D]}) 

당신은 조정 요구에 열 이름이 필요합니다 project_category, 특정 USER_ID 우리가 관심 카테고리의 배열을 전달하지만, :. 사용자와 : 여기

우리는 관련이 포함 이런 식으로 시작할 수 있어야합니다.

+0

이것은 사실이지만 단점은 3 개의 SQL 쿼리 결과입니다. 또한 그가 미리 범주 목록을 가지고 있는지 또는 추가 쿼리가 필요한 사용자 모델에서 왔는지 여부는 확실하지 않습니다. –

+0

사실, 카테고리 목록이 사용자와 연관되어 있으므로 'current_user.project_categories'가됩니다. – par

+0

멍청한 탓에 미안하지만 특정 user_id와 A, B, C, D가 확인되면 죄송합니다. 'ActiveRecord :: RecordNotFound : ID없이 프로젝트를 찾을 수 없습니다 '오류가 발생했습니다. 처음에는 내가 포함 된 것을 읽어야 할 것입니다. – par