0

這是設置,我有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?

+0

你說:「一個帖子可以沒有圖像」。這不是你的代碼顯示的。但如果這真的是你的意思,當你顯示一篇文章,通過帖子的用戶獲取圖像。 – Daiku

+0

'has_many:through'不允許我將圖像分配給多個帖子。另外,我沒有看到我的結構不允許沒有圖像的帖子,因爲has_many關係可能是空的。 –

+1

看起來你已經選擇了你的答案。我並不是在建議一種實際的:通過關係。只是說你可以用post.user.image這樣的東西來獲取圖像。但我可能完全不瞭解你的模式。只是在你的評論中,關於你的開頭段落中的「帖子沒有圖片」而感到困惑。 – Daiku

回答

1

爲此的典型解決方案是存儲assocciation表內的圖像型和具有一個額外的assocciation對象:

Post.rb

class Post < ActiveRecord::Base 
    has_and_belongs_to_many :postImage 
end 

Image.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 

這會增加代碼行以獲得相關聯的對象(後 - > postImage - >圖像,而不是:後 - >圖像),但保持易於維護和理解。

這真的派上用場,當你有比只有類型的鏈接更多的附加信息......

相關問題