1

사용자가 여러 프로젝트를 가질 수 있고 각 프로젝트가 여러 작업을 수행 할 수있는 다음과 같은 설정이 있습니다. 사용자는 여러 프로젝트를 좋아할 수 있습니다.레일에서 다형 모델로 데이터베이스보기 연결

class User < ActiveRecord::Base 
    has_many :projects 
    has_many :tasks, :through => :projects 
    has_many :favourites 
    has_many :favourite_projects, :through => :favourites, :source => :favourable, :source_type => "Project" 
    has_many :favourite_tasks, :through => :favourite_projects, :source => :tasks 
    ... 
end 

class Project < ActiveRecord::Base 
    belongs_to :user 
    has_many :tasks 
    has_many :favourites, :as => :favourable 
    ... 
end 

class Task < ActiveRecord::Base 
    belongs_to :project 
    ... 
end 

class Favourite < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :favourable, :polymorphic => true 
    ... 
end 

이 설정은 @user.favourite_tasks들이 favourited 한 프로젝트에 대한 모든 작업을 나열 할 수 있습니다.

여기에서 (http://pivotallabs.com/database-views-performance-rails/) 제안을 취하여 가능한 경우 데이터베이스보기로 다단계 테이블 조인을 대체하려고합니다.

뷰 SQL은 다음과 같습니다

SELECT tasks.id AS task_id, ..., projects.id AS project_id, ... 
FROM tasks INNER JOIN projects ON projects.id = tasks.project_id 

나의 새로운 ProjectTask 모델이다 : 내 User 모델을 업데이트 한

class ProjectTask < ActiveRecord::Base 
    self.primary_key = 'task_id' 
end 

포함 : 위해 잘 작동

has_many :project_tasks 

@user.project_tasks.

그러나 즐겨 찾기가 작동하도록 모델에서 has_many/has_one/belongs_to이 무엇인지 알아낼 수는 없습니다 (즐겨 찾기를 프로젝트 테이블이 아닌보기로 연결).

내 컨트롤러에 @user.favourite_project_tasks을 사용하고 ProjectTask 모델 스코프를 첨부 할 수 있도록 has _many :favourite_project_tasks, :through => :favourites....을 목표로합니다. 는 내가 ProjectTask 모델은 기본 키로 task_id을 가지고 있다는 사실은 레일 테이블/뷰를 연결하고 :through 무시 :foreign_key:primary_key의 사용을 사용하기 때문에 (http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many에 따라)에 문제를 일으키는 생각합니다.

누군가가 기쁘지 않은 변화의 조합을 시도했기 때문에 내가 뭘해야하는지 조언 해 줄 수 있기를 바랍니다.

감사합니다.

답변

0

사용자 지정 기본 키 때문에 문제가 발생한 것으로 보입니다.

has_many :favourite_project_tasks, :through => :favourite_projects, :source => :project_tasks 

이보기를 사용하고 또한 사용하는 뷰를 변경 :

SELECT tasks.id AS id, ... 

보다는 (이 실패 할 때 이미이 일을했다)와 User 모델을 업데이트하여

:

SELECT tasks.id AS task_id, ... 

ProjectTask 뷰 모델을 다음과 같이 변경하십시오.

self.primary_key = :id 

이제 작동합니다.

관련 문제