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 

它现在可以工作。

相关问题