我正在开发一款包含大量照片的应用,这些照片由用户提供。照片共享方面是该应用的主要目的。
有时创建照片的精选“收藏集”会很有帮助。因此,在ActiveRecord中这很容易:Collection has_many :photos
和Photo belongs_to :collection
。
我的问题是,对于不属于特殊收藏品的“普通”照片,我应该:
:一种。根本没有它属于任何集合。即:photo.collection == nil
- 或 -
B中。创建一个包含每张照片的通用“社区集”。即默认情况下photo.collection == 'Community'
我也在考虑这是否应该是HABTM关系。
反馈将非常感谢!
答案 0 :(得分:7)
这取决于你对未收集的照片要做什么,真的。如果您希望能够使用用于显示集合的相同操作显示未收集的照片,那么您将希望拥有该通用集合。否则,我会把它留下来;我不喜欢将“种子”数据与用户数据混合在同一个表格中(您将使用“未收集的”集合进行处理) - 在重新播种时,很容易意外删除用户数据。
它应该是HABTM关系吗?同样,取决于您想如何使用它。如果您很有可能希望照片属于多个馆藏,那就去吧。
我在这里提到的事情我将不做:添加'ptype'属性来告诉单身人士收集的照片(浪费数据库空间 - 你已经可以获得该信息通过致电photo.collection_id.nil?
);并且使用多态模型(你不希望单身照片的行为完全不同,我想,所以这增加了复杂性,几乎没有任何好处)。
但是,命名范围是一个好主意,如果您没有“未收集”的集合来查找您的单身人士,它将特别有用:
#Apologies for the Rails 2.3 code - it's what I know...
named_scope :singletons, {:conditions => {:collection_id => nil}}
或HABTM版本:
named_scope :singletons, lambda {
{:conditions => ['NOT EXISTS (SELECT * FROM collections_photos WHERE photo_id = ?)', self.id]}
}
希望这有帮助!
答案 1 :(得分:1)
使用ptype属性怎么样?你可以有photo.ptype ='collection'或photo.ptype ='single'。这样您就可以按照该类型识别每张照片。此外,您可以通过在照片上使用范围并指定collection_photos范围或single_photos来使其更加优雅。
另一种可能性是多态模型。有一个照片模型和正在使用它的collectionPhoto和singlePhoto模型。
答案 2 :(得分:1)
我只会在属于集合时设置集合属性。请确保您的视图代码可以处理此案例。