【发布时间】:2015-05-21 21:43:16
【问题描述】:
我有以下设置:
class Album < ActiveRecord::Base
has_many :photos
end
class Photo < ActiveRecord::Base
belongs_to :album
end
我想做的是为每张专辑定义一个profile_photo 和一个cover_photo,但我不确定如何进行设计。
第一次尝试是使用has_one :profile_photo, class: 'Photo' 进行迁移,在Photo 模型上创建albums.profile_photo_id 字段和has_one :album。不起作用,因为生成的 SQL 查询不正确:
> album.profile_photo
Photo Load (0.4ms) SELECT "photos".* FROM "photos" WHERE "photos"."album_id" = $1 LIMIT 1 [["album_id", 16]]
=> #<Photo id: 14, album_id: 16, image: "image_l.jpg", created_at: "2015-05-21 20:03:42", updated_at: "2015-05-21 20:03:42">
另一种方法是向Photo 模型添加布尔值,例如photos.is_profile_photo,然后在类上创建一个作用域关联,但我觉得这不是最佳选择:
- 我必须注意保持相册照片同步,所以只有一张布尔值设置为 1。
- 将信息添加到照片表,将其与相册一相结合。如果我想在相册之外添加照片,它们将有两个额外的字段
is_profile_photo和is_cover_photo,这是没有意义的。
有没有我想念的“Rails 方式”来做到这一点?
【问题讨论】:
-
我不确定我是否完全理解您的用例,但您是否看过 STI?如果您不熟悉,here 是一个很好的概述。
-
我不认为这是一个复杂的用例,只是尝试使用一堆照片的相册模型,其中两张需要标记为特殊(个人资料和封面),Facebook 风格。不确定 STI 如何适合这里,感觉为
ProfilePhoto/CoverPhoto提供不同的课程感觉太过分了(如果这是你的建议)。
标签: ruby-on-rails-4 associations