Rails 相册、照片和封面的处理

lutas · 2012年09月21日 · 最后由 lutas 回复于 2012年09月22日 · 2207 次阅读

各位,我在使用 Rails 实现相册功能时碰到一个让我比较纠结的问题,因为我学习 Rails 的时间不长,问题比较浅显,还请见谅;

我要实现两个简单的需求:

  1. 使用相册来管理我的照片,然后我可以选择其中的一张来作为相册的封面,
  2. 并且照片是可以属于个人的,或者属于其他某个组织的;

我实现的具体的代码

class Album < ActiveRecord::Base
    attr_accessible :name, :description,:type
    has_many :photos
    belongs_to :cover, :class_name => 'Photo'
    belongs_to :author, :class_name => 'Person'
end
class Photo < ActiveRecord::Base
    belongs_to :album, :counter_cache => true
    has_one :album,:foreign_key => "cover_id"
    belongs_to :author, :class_name => 'Person'
end

功能 1:上述代码的描述可以实现,但是我感觉这个关系让我处理得非常别扭;rails 应该不是这样玩的;

功能 2:我的想法是给 album 加一个 type,由 type 来决定 album 是属于个人的还是其他某个组织,但是我总觉得操作起来有些繁琐;

希望大家能帮我解惑,谢谢!

  1. 我觉得没有问题啊。
  2. 试试多态关联,原理就是加了一个 type http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

has_one :album,:foreign_key => "cover_id"

这行可以不要了,应该没有这种查询需求,也省一个 albums 表的索引。

还有一个我习惯类名是什么关联名就是什么,如果不是有很多同类关联的话,这样编码的时候要思考的东西少些。

belongs_to :person

#1 楼 @Rei 1 的话,那个belongs_to :cover有点不合逻辑吧。。 2 的话,觉得这里 photo 对于个人和组织来说意义没什么差别,直接用两个 one to many 的应该也可以吧?

#3 楼 @Rei 嗯 这个确实是

@Rei 谢谢你的回复;

Photo 不要这个has_one:album的话,当我要删除某张已经作为封面的照片会比较麻烦一点,是可以考虑去掉; 不过我还是觉得有些别扭,因为我甚至考虑了将belongs_to :cover都去掉,我直接更新 cover_id

类名是什么关联名就是什么 因为我觉得的 album.person 怪怪的,album.author 我更能理解一些。

@Tony612 photo 如果是属于组织的话,那么他的 author 就会有意义;

那个 belongs_to :cover 有点不合逻辑吧。。

我也这么认为,所以我有考虑了将 belongs_to :cover 都去掉,我直接更新 cover_id 的想法。

#4 楼 @Tony612 不考虑 ActiveRecord,单从数据库设计上来说 cover_id 放在 ablums 表很合理,所以适当越过约定。

#6 楼 @lutas 因为大部分图片都不是作为封面的,所以从 photo 出发查找 album 是很浪费的,最好还是从 album 反过来检查这张图片是不是封面,如果是同一个相册内的批量操作,album 是同一个实例不会执行查询,而用 has_one 就需要了。

不过不了解实际场合,所以可以继续尝试 has_one。

#8 楼 @Rei 恩,photo 去掉has_one :album你这么一说,很赞同了。

如果仅考虑 ActiveRecord 的话,cover 应该是怎样的一个处理方式呢?

#9 楼 @lutas 用 belongs_to 没什么问题。

#8 楼 @Rei 确实。。一直以为一对一和一对多的包含关系中,所产生的 XX_id 放置结果是一样的。。

#10 楼 @Rei 恩恩,谢谢 Rei 抽空回答,非常感谢!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号