Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用单个表在一个模型和多个其他模型之间建立HABTM关系?_Ruby On Rails_Ruby On Rails 3_Polymorphism_Associations_Has And Belongs To Many - Fatal编程技术网

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