0

对于以下情况,我很难围绕必要的关联来思考:

  • 我有一个“上传”,可以附加到“人”、“组”、“项目”或“办公室”。

  • 一个上传需要同时属于多个人、组或项目(即:可以链接到两个人、三个项目、一个组、两个办公室。)

  • 一个人、一个项目、一个组或一个项目可以有多个与之关联的上传。

  • 我希望能够获取与对象关联的所有上传(例如:@project.uploads),以及上传链接到的所有项目(在单一方法中,例如@upload.linked_to)

我试图避免为每个可能的关联(projects_uploads、people_uploads、office_uploads)创建一个表,因为我希望它更灵活,因为将来我可能希望将上传链接到其他模型。

多态关联可能是我需要的......但我还没有找到一个与我想要完成的例子非常相似的例子。

有人可以指出我正确的方向吗?

谢谢!如有必要,我可以尝试澄清我的问题:)

编辑: 解决了!这就是我最终设置它的方式:


楷模

上传.rb

class Upload < ActiveRecord::Base

  has_many :upload_connections

  def linked # Shortcut for @upload.upload_connections
    self.upload_connections
  end

end

上传连接.rb

class UploadConnection < ActiveRecord::Base

  belongs_to :uploadable, :polymorphic => true
  belongs_to :upload

end

Project.rb / Office.rb / Person.rb 等

class Project < ActiveRecord::Base 
# (same for project, office, person, etc.)

  has_many :upload_connections, :as => :uploadable
  has_many :uploads, :through => :upload_connections

end

表结构

上传

id: integer
filename: string
description: string

上传连接

id: integer
uploadable_id: integer
uploadable_type: string
upload_id: integer

...加上您想要关联的任何对象的表格。

4

1 回答 1

1

多态关联就是你想要的。我认为您不希望每个关联都有单独的表。那只会变得混乱。

class Upload << AR
  has_many :links
  has_many :users, :through => :links, :conditions => {:mediable_type => 'User'}
end

class Link << AR
  belongs_to :upload
  belongs_to :linkable, :polymorphic => true
end

class User << AR # and Project, Group, and Office
  has_many :links, :as => :linkable
  has_many :uploads, :through => :links
end

FWIW,“链接”是一个可怕的名字,但我现在想不出更好的名字。我的一些语法可能不正确,但应该足够接近让你继续前进。

于 2013-07-20T19:06:17.190 回答