1

我有以下設置允許用戶擁有多個項目,每個項目可以有多個任務。用戶可以喜歡多個項目。在rails中使用多態模型連接數據庫視圖

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列出了他們已經收藏最多項目的所有任務。

從這裏採取建議(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模式是:

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

我已經更新了我User模式,包括:

has_many :project_tasks 

這對於工作正常@user.project_tasks

但是,我無法弄清楚has_many/has_one/belongs_to應該在模型中的最愛工作(連接收藏夾視圖,而不是項目表)。

我的目標是has _many :favourite_project_tasks, :through => :favourites....,以便我可以在我的控制器中使用@user.favourite_project_tasks,並在需要時將任何ProjectTask模型示波器附加到它。 我認爲ProjectTask模型task_id作爲主鍵的事實是造成問題與軌道連接的表/視圖,因爲使用:through覆蓋任何使用:foreign_key:primary_key(根據http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many)。

希望有人可以建議我應該做什麼,因爲我已經嘗試過大量的組合變化沒有喜悅。

謝謝

回答

0

問題似乎是由自定義主鍵造成的。

通過更新User模型(我已經這樣做了,當它不及格):

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

使用的視圖,並改變視圖中使用:

SELECT tasks.id AS id, ... 

,而不是:

SELECT tasks.id AS task_id, ... 

並更改要使用的視圖模型ProjectTask

self.primary_key = :id 

它現在可以工作。

相關問題