使用rails中的多态模型连接数据库视图

时间:2015-01-07 22:16:20

标签: postgresql ruby-on-rails-4 view has-many-through polymorphic-associations

我有以下设置,允许用户拥有多个项目,每个项目可以有多个任务。用户可以喜欢多个项目。

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的任何使用{{1}}(根据http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many)。

希望有人可以告诉我应该做些什么,因为我已经尝试了很多变化的组合而没有快乐。

由于

1 个答案:

答案 0 :(得分: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

它现在有效。