过滤多态的belongs_to关系

时间:2015-03-02 21:19:22

标签: ruby-on-rails activerecord polymorphism

假设我有这些模型:

class Image < ActiveRecord::Base
  has_many :attachments, as: :attachable
end

class File < ActiveRecord::Base
  has_many :attachments, as: :attachable
end

class Attachment < ActiveRecord::Base
  belongs_to :attachable, polymorphic: true

  # How can I add an image relation?
  belongs_to :image ...
  belongs_to :file ...
end

将图像/文件关系添加到附件模型

的最佳方法是什么

这就是我最终想要实现的目标:

class Page < ActiveRecord::Base
  has_many :attachments, as: :attacher

  # ?
  has_many :images, 
  has_many :files
end

1 个答案:

答案 0 :(得分:0)

如果我的Imagelink =你的附件,我的图片=你的页面,我的项目=你的图片,我的场景=你的文件(或者它已经很久了,我没有正确记住我自己的代码),也许类似于这个。

class Project
  has_many :imagelinks, :as => :displayable, :dependent => :destroy
  has_many :images, :through => :imagelinks
end

class Scenario
  has_many :imagelinks, :as => :displayable, :dependent => :destroy
  has_many :images, :through => :imagelinks
end

class Unittest
  has_many :imagelinks, :as => :displayable, :dependent => :destroy
  has_many :images, :through => :imagelinks
end

class Imagelink
  # attributes: id, image_id, displayable_id, displayable_type
  belongs_to :image
  belongs_to :displayable, :polymorphic => true
  belongs_to :project, :class_name => 'Project', :foreign_key => 'displayable_id'
  belongs_to :scenario, :class_name => 'Scenario', :foreign_key => 'displayable_id'
  belongs_to :unites, :class_name => 'Unittest', :foreign_key => 'displayable_id'
end

class Image
  has_many :imagelinks, :dependent => :destroy
  has_many :projects, :through => :imagelinks, :source => :project, :conditions => "imagelinks.displayable_type = 'Project'"
  has_many :scenarios, :through => :imagelinks, :source => :scenario, :conditions => "imagelinks.displayable_type = 'Scenario'"
  has_many :unittests, :through => :imagelinks, :source => :unittest, :conditions => "imagelinks.displayable_type = 'Unittest'"
  has_attached_file :asset, :styles => { blah blah blah }
end