【问题标题】:Connecting database view with polymorphic model in rails在rails中将数据库视图与多态模型连接起来
【发布时间】: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 =&gt; :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


    【解决方案1】:

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

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

    现在可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      相关资源
      最近更新 更多