2

我注意到我可能已经创建了一个关系问题。

我从一个照片模型开始。管理员可以上传照片,它们将存在于网站上。

在后来的迭代中,相册被添加到代码库中,以便可以在自己的页面上组织一组照片。

Album
  has_many :photos, inverse_of: :album
Photo
  belongs_to :album, inverse_of: :photo

在玩了上面的之后,我注意到一张照片只能属于一个相册。没关系。

现在出现了一个新问题。我想添加工作人员的照片,他们也是他们自己的模特。

我的照片模型中还有一些特殊的逻辑来处理使用特定的上传服务(文件选择器)。

Staff
  field :name, type: String

我怎样才能让员工拥有自己的照片?我应该为非规范化创建一个新模型 StaffPhoto 吗?我正在考虑将照片嵌入或属于员工,但我不确定同时属于专辑和员工是否有意义。现在对我来说最有意义的事情是创建一个单独的模型并将上传服务逻辑抽象到一个模块中并将其包含在两者中。但是我可能是错的。重要的部分是 Photo 的整体将单独存在,或者是相册的一部分,或者是工作人员的一部分(多张照片)。

关于如何建模的任何建议?

4

2 回答 2

1

您正在寻找的内容在指南中得到了完美的描述:http: //guides.rubyonrails.org/association_basics.html#polymorphic-associations

您可以创建一个多态关联:

class Photo < ActiveRecord::Base
  belongs_to :photoable, :polymorphic => true
end

class Album < ActiveRecord::Base
  has_many :photos, :as => :photoable
end

class Staff < ActiveRecord::Base
  has_many :photos, :as => :photoable
end
于 2013-04-08T23:21:00.240 回答
1

当您拥有属于不同所有者类别的事物时,多态关联是很好的;例如,当您有可能来自电影或电视节目的照片,并且您的数据库中已经建模了电影和电视节目时——那么您将使用多态关联来引用“所有者”对象一张照片。

通常,您不希望使用单独的模型对 Admins、Staff 和 Users 进行建模。一种更简洁的方法是将它们全部建模为用户,然后分别建模角色和权限,例如,每个人都可能是管理员。

如果您选择了这种类型的用户建模,那么您在照片模型中所需要的只是一个 user_id 来模拟所有者是谁——您不在乎那是管理员、员工还是普通用户。

如果您还想对照片的使用方式进行建模,例如,管理员照片与员工照片完全不同(例如,管理员照片是背景,员工照片是头像),那么您可能还需要指定“照片类型”归因于照片。

我不认为在你的场景中多态关联是最好的解决方案。

请查看关于角色/授权的 Railscast,这样您就可以在一个模型中对管理员/员工进行建模。

http://railscasts.com/episodes?search=authorization


关于嵌入式文档:

使用嵌入式文档的注意事项很少:

  • 嵌入文档是否增加/丰富了父文档?
  • 不超过 16MB 的 MongoDB 记录大小
  • 如果您需要搜索所有嵌入式文档

如果是照片,您可能希望嵌入对照片的引用,而不是照片本身,因为照片可能具有较大的尺寸。

对于您的应用程序,用户有多少张照片?随着时间的推移,它们的数量会增长到可观的数量吗?如果是,那么您可能不想嵌入它们。

照片是否增加了用户记录?例如,它是头像照片吗?如果没有,那么您可能不想嵌入它。

您是否需要搜索照片?可能不是。其他类型的嵌入文档可能需要从顶层搜索,然后您无法嵌入它们。

于 2013-04-15T00:41:00.363 回答