Rails:如果Foo has_many:吧,那么所有:吧需要属于一个Foo吗?

时间:2011-02-22 22:14:21

标签: ruby-on-rails ruby-on-rails-3 activerecord associations

我正在开发一款包含大量照片的应用,这些照片由用户提供。照片共享方面是该应用的主要目的。

有时创建照片的精选“收藏集”会很有帮助。因此,在ActiveRecord中这很容易:Collection has_many :photosPhoto belongs_to :collection

我的问题是,对于不属于特殊收藏品的“普通”照片,我应该:

:一种。根本没有它属于任何集合。即:photo.collection == nil

- 或 -

B中。创建一个包含每张照片的通用“社区集”。即默认情况下photo.collection == 'Community'

我也在考虑这是否应该是HABTM关系。

反馈将非常感谢!

3 个答案:

答案 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)

我只会在属于集合时设置集合属性。请确保您的视图代码可以处理此案例。