Ruby on rails 如何使用单个表在一个模型和多个其他模型之间建立HABTM关系?
在以下情况下,我很难将注意力集中在必要的关联上:Ruby on rails 如何使用单个表在一个模型和多个其他模型之间建立HABTM关系?,ruby-on-rails,ruby-on-rails-3,polymorphism,associations,has-and-belongs-to-many,Ruby On Rails,Ruby On Rails 3,Polymorphism,Associations,Has And Belongs To Many,在以下情况下,我很难将注意力集中在必要的关联上: 我有一个“上传”,可以附加到一个“人”,一个 “团队”、“项目”或“办公室” 上传需要同时属于多个人、组或项目(即:可以链接到两个人、三个项目、一个组、两个办公室) 一个人、一个项目、一个组或一个项目可以有多个与之相关联的上传 我希望能够获取与对象关联的所有上传(例如:@project.Uploads),以及上传链接到的所有项目(在单个方法中,例如@upload.linked_to) 我试图避免为每个可能的关联(项目上传、人员上传、办公室上传
- 我有一个“上传”,可以附加到一个“人”,一个 “团队”、“项目”或“办公室”
- 上传需要同时属于多个人、组或项目(即:可以链接到两个人、三个项目、一个组、两个办公室)
- 一个人、一个项目、一个组或一个项目可以有多个与之相关联的上传
- 我希望能够获取与对象关联的所有上传(例如:@project.Uploads),以及上传链接到的所有项目(在单个方法中,例如@upload.linked_to)
型号 Upload.rb
class Upload < ActiveRecord::Base
has_many :upload_connections
def linked # Shortcut for @upload.upload_connections
self.upload_connections
end
end
class UploadConnection < ActiveRecord::Base
belongs_to :uploadable, :polymorphic => true
belongs_to :upload
end
上传连接
id: integer
filename: string
description: string
id: integer
uploadable_id: integer
uploadable_type: string
upload_id: integer
。。。加上要与之关联的任何对象的表 多态关联是您想要的。我认为您不希望每个关联都有单独的表。那会变得一团糟
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
类上载:链接,:条件=>{:mediable_type=>'User'}
结束
类链接为true
结束
类用户:可链接
有很多:上传,:通过=>:链接
结束
FWIW,“链接”是一个可怕的名字,但我现在想不出更好的名字了。我的一些语法可能已经关闭,但应该足够接近,可以让您继续使用。如果您为每个join添加一个sep列,我认为这是可能的。但不太确定它是否是好的设计。@MichaelSzyndel-谢谢你的回复!使用多个表(项目上传、人员上传、办公室上传)并创建一个自定义方法来提取属于单个上传的所有关系是否更好?上传和项目/人员/办公室之间的关系是否多态?@MichaelSzyndel-我最终使用提供的信息解决了这个问题。谢谢你的帮助!谢谢通过研究这篇文章,我最终发现了一个类似的情况。现在它工作了:)用我的答案编辑了我的问题。
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