在 rails 中将数据库视图与多态模型连接

Connecting database view with polymorphic model in 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/) 我正在尝试将 multi-level table 连接替换为可能的数据库视图。

观点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 应该是什么才能使收藏夹起作用(将收藏夹连接到视图而不是项目 table)。

我的目标是 has _many :favourite_project_tasks, :through => :favourites.... 以便我可以在我的控制器中使用 @user.favourite_project_tasks 并在需要时附加任何 ProjectTask 模型范围。 我认为 ProjectTask 模型具有 task_id 作为主键的事实导致 rails 链接 tables/view 的问题并且因为使用 :through 覆盖了任何使用:foreign_key:primary_key(根据 http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many)。

希望有人可以建议我应该做什么,因为我已经尝试了很多变化组合,但并不愉快。

谢谢

问题似乎是由自定义主键引起的。

通过更新 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

现在可以使用了。