这是设置,我有 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 的?