在 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
现在可以使用了。
我有以下设置,允许用户拥有多个项目,每个项目可以有多个任务。一个用户可以收藏多个项目。
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
现在可以使用了。