0

セットアップは次のとおりです。投稿、ユーザー、および画像の 3 つのクラスがあります。ユーザーには投稿があり、ユーザーには画像があります。投稿にも画像がありますが、ユーザーに属する画像のみです。複数の投稿が同じ画像を持つことができ、複数の画像が 1 つの投稿に属することができます。投稿に画像を含めることはできず、画像は必ずしも投稿に属する必要はありません。これらすべてを念頭に置いて、これがデータベース構造について思いついたものです。

ユーザー.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

さて、私の問題は、投稿ごとに 1 つの注目の画像を持ち、ユーザーにはそれぞれの画像グループのプロフィール画像を持たせたいということです。私の最初の直感は、User.rb と Post.rb に以下を追加することです。

has_one :featured_image, class_name: "Image"

これを Image.rb に

belongs_to :post
belongs_to :user

しかし、これはデータベースの観点からは正しくないようです。まず、2 番目の belongs_to は画像オブジェクトで冗長になりますが、さらに無駄に思えます。これにより、ほとんど使用されていない 2 つの列全体が画像テーブルに追加されます。ホスティング スペースの料金を支払っているときに、それが表示されるという考えは好きではありません。

次の論理的な解決策は、has_one と belongs_to を逆にして、begs_to を user と post に、has_ones を image に配置することですが、それはあまりセマンティックではないようです。さらに、多対多の関係が既に存在するため、まだ冗長に見えます。

images_posts テーブルを変更して、多対多の関係内からこれらの特別な関連付けを表す方法はありますか、それともレールに問題がありますか? 私が気付いていない、または逆の has_one に戻す必要がある、これを行うためのより良い方法はありますか?

4

1 に答える 1