【问题标题】:Rails: If Foo has_many :bars, do all :bars need to belong_to a Foo?Rails:如果 Foo has_many :bars,所有 :bars 都需要属于 Foo 吗?
【发布时间】:2011-02-22 22:14:21
【问题描述】:

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

有时创建精选的“照片集”会很有帮助。所以,这在 ActiveRecord 中很简单:Collection has_many :photosPhoto belongs_to :collection

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

A.根本不属于任何收藏。 即:photo.collection == nil

-或-

B.创建一个包含每张照片的通用“社区收藏”。 即默认为photo.collection == 'Community'

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

非常感谢您的反馈!

【问题讨论】:

  • 还有一个问题,关于加分:如果“未收集”的照片不属于通用收藏,我需要警惕哪些行为(如果有)?

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


【解决方案1】:

实际上,这取决于您要如何处理未收集的照片。如果您希望能够使用与显示集合相同的操作来显示未收集的照片,那么您将希望拥有该通用集合。否则,我会把它留空;我不喜欢在同一个表中将“种子”数据与用户数据混合在一起(您将使用“未收集”集合进行此操作) - 重新播种时很容易意外清除您的用户数据。

应该是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]}
}

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    使用 ptype 属性怎么样?你可以有 photo.ptype = 'collection' 或 photo.ptype = 'single'。这样,您就可以按该类型识别每张照片。此外,您可以通过在照片上使用范围并指定 collection_photos 范围或 single_photos 来使其更加优雅。

    另一种可能性是多态模型。有一个照片模型和一个正在使用它的 collectionPhoto 和 singlePhoto 模型。

    【讨论】:

    • 所以,我以前从未听说过 ptype。这只是照片模型上的一个属性,我用它来判断照片是否在集合中?
    • 是的,只是一个名字 :) 你不能使用 type 因为它是 Rails 关键字;这就是我使用 ptype 的原因,但它可以是你想要的任何东西。
    【解决方案3】:

    我只会设置属于集合的集合属性。只要确保您的视图代码可以处理这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 2020-10-03
      • 2022-01-16
      • 1970-01-01
      • 2010-12-12
      • 2016-09-09
      相关资源
      最近更新 更多