我有以下设置允许用户拥有多个项目,每个项目可以有多个任务。用户可以喜欢多个项目。在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)。
希望有人可以建议我应该做什么,因为我已经尝试过大量的组合变化没有喜悦。
谢谢