這是設置,我有3個類:帖子,用戶和圖像。用戶有帖子和用戶有圖片。帖子也有圖片,但也只有屬於其用戶的圖片。多個帖子可以具有相同的圖像,並且多個圖像可以屬於一個帖子。帖子可以沒有圖片,圖片不一定需要屬於帖子。有了這一切記住,這是我想出了一個數據庫結構:如何在Rails中最好地混合has_one和has_and_belongs_to_many?
User.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
Image.rb
class Image < ActiveRecord::Base
has_and_belongs_to_many :posts
belongs_to :user
end
現在,我的問題是,我想每個帖子都有一個精選的圖像和用戶從他們各自的gr圖像的圖像。我的第一本能是添加以下User.rb和Post.rb:
has_one :featured_image, class_name: "Image"
和這Image.rb
belongs_to :post
belongs_to :user
但這似乎並沒有從數據庫的角度來看的權利。首先,第二個belongs_to對於圖像對象將是多餘的,但進一步看起來很浪費。這會在圖像表中添加兩個完整的,大多數未使用的列,並且我不喜歡這種看到的想法,因爲我支付了我的主機空間。
下一個合乎邏輯的解決方案似乎是顛倒has_one和belongs_to,將belongs_to放在用戶和post上,並將has_ones放在圖像上,但這看起來不是很有意思。此外,由於多對多關係已經存在,它似乎仍然是多餘的。
有沒有辦法修改images_posts表來表示多對多關係中的這些特殊關聯,還是會對rails有問題?有沒有更好的方式來做到這一點,我不知道或者我應該只是恢復到相反的has_one?
你說:「一個帖子可以沒有圖像」。這不是你的代碼顯示的。但如果這真的是你的意思,當你顯示一篇文章,通過帖子的用戶獲取圖像。 – Daiku
'has_many:through'不允許我將圖像分配給多個帖子。另外,我沒有看到我的結構不允許沒有圖像的帖子,因爲has_many關係可能是空的。 –
看起來你已經選擇了你的答案。我並不是在建議一種實際的:通過關係。只是說你可以用post.user.image這樣的東西來獲取圖像。但我可能完全不瞭解你的模式。只是在你的評論中,關於你的開頭段落中的「帖子沒有圖片」而感到困惑。 – Daiku