我一直在试图弄清楚如何将我的模型与我一直在从事的项目相关联,并且我之前曾多次来这里寻求帮助,但我从未得到令人满意的答案。我有两个模型:帖子和图像。每个帖子都附有几张图片,并且帖子可以共享图片,因此 HABTM 关系对此很有意义,如下所示:
class Post < ActiveRecord::Base
has_and_belongs_to_many :images
end
class Image < ActiveRecord::Base
has_and_belongs_to_many :posts
end
现在的问题是我希望每个帖子都有一个“特色图片”。我该怎么做呢?想到的第一个想法是has_one :featured_image
帖子和belongs_to :post_featured_on
图片上的简单内容,但问题是同一张图片可以出现在多个帖子上。
所以我想出的下一个想法是扭转关系:belongs_to :featured_image
在帖子和has_many :posts_featured_on
图像上。问题在于它不是很语义化,并且 rails 似乎不想让我从其表单中设置帖子的特色图像,就像在控制器中这样:Post.new(:featured_image => Image.find(params[:image_id]))
所以向我建议的下一个想法是第二个 HABTM 关系,如下所示:has_and_belongs_to_many :featured_images
. 这有一个明显的问题,它是复数形式。我尝试unique: true
在迁移中添加 post_id 列,但这无济于事,因为我一直不得不在我的代码中这样做:post.featured_images.first
这可能非常令人沮丧。
has_many :posts, through: :attachment
我尝试的最后一个想法是has_one :featured_posts, through: :attachment
代替原始的 HABTM,但这些似乎不必要地麻烦,并且 rails 似乎不想让我以这种方式动态分配图像Post.new(:featured_image => Image.find(params[:image_id]))
。
有什么好的方法可以做到这一点吗?我在之前的尝试中做错了什么吗?这不应该只是 post 表上的一个简单外键吗?为什么一定要这么难?