我有以下设置,允许用户拥有多个项目,每个项目可以有多个任务。用户可以喜欢多个项目。
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)。
希望有人可以告诉我应该做些什么,因为我已经尝试了很多变化的组合而没有快乐。
由于
答案 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
它现在有效。