【发布时间】:2015-01-07 22:16:20
【问题描述】:
我有以下设置,允许用户有多个项目,每个项目可以有多个任务。一个用户可以收藏多个项目。
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 作为主键这一事实导致了rails 链接表/视图的问题,并且因为使用:through 覆盖了:foreign_key 和:primary_key 的任何使用(根据@987654322 @)。
希望有人可以建议我应该做什么,因为我已经尝试了很多变化的组合,但没有任何乐趣。
谢谢
【问题讨论】:
标签: postgresql ruby-on-rails-4 view has-many-through polymorphic-associations