0

这是设置,我有 3 个类:帖子、用户和图像。用户有帖子,用户有图片。帖子也有图像,但也只有属于其用户的图像。多个帖子可以有相同的图像,并且多个图像可以属于一个帖子。帖子可以没有图像,图像不一定必须属于帖子。考虑到所有这些,这就是我想出的数据库结构:

用户.rb:

class User < ActiveRecord::Base
  has_many :posts, dependent: :destroy
  has_many :images, dependent: :destroy
end

Post.rb:

class Post < ActiveRecord::Base
  has_and_belongs_to_many :images
  belongs_to :user
end

图片.rb

class Image < ActiveRecord::Base
  has_and_belongs_to_many :posts
  belongs_to :user
end

现在,我的问题是,我希望每个帖子都有一个特色图像,而用户则希望拥有来自各自图像组的个人资料图像。我的第一反应是将以下内容添加到 User.rb 和 Post.rb 中:

has_one :featured_image, class_name: "Image"

这对 Image.rb

belongs_to :post
belongs_to :user

但从数据库的角度来看,这似乎并不正确。首先,第二个belong_to 在图像对象上将是多余的,但进一步看起来很浪费。这会将两个完整的、大部分未使用的列添加到图像表中,我不喜欢在为托管空间付费时看到的想法。

下一个合乎逻辑的解决方案似乎是将 has_one 和 belongs_to 颠倒过来,将 belongs_to 放在 user 上,然后 post 和 has_ones 放在 image 上,但这似乎不太符合语义。此外,它似乎仍然是多余的,因为多对多关系已经存在。

有没有办法修改 images_posts 表以从多对多关系中表示这些特殊关联,或者这对 Rails 有问题吗?有没有更好的方法可以做到这一点,我不知道或者我应该恢复到反向的 has_one 的?

4

1 回答 1

1

一个典型的解决方案是将图像类型存储在关联表中并具有额外的关联对象:

Post.rb

class Post < ActiveRecord::Base
    has_and_belongs_to_many :postImage
end

图片.rb

class Image < ActiveRecord::Base
    has_and_belongs_to_many :postImage
end

PostImage.rb

class PostImage < ActiveRecord::Base
   has_one :post
   has_one :image
end

这将增加获取关联对象的代码行数(post -> postImage -> image,而不是:post -> image),但易于维护和理解。

当您在链接中有更多的附加信息而不仅仅是类型时,这真的很方便......

于 2013-08-06T19:00:20.877 回答