0

ここでは、インターネット上に広がる多くの記事やドキュメントに加えて、ジョインテーブル、STIテーブル、多態的な関連付けに関する多くの質問と回答を読んでいます。私は多くを学んだが、私は自分の状況で何をすべきかについて、まだ混乱している。私は答えを読んでいるかもしれませんが、私は答えを読んでいましたが、誰かが私がここですべきことを理解するのを助けることができるかどうかを見たいと思っていました。Join Table Confusion Ruby on Rails

私はギャラリーモデル、アルバムモデル、画像モデル、カテゴリモデルを持っています。これらはすべてUserモデルにネストされています。

アルバムを作成するときにカテゴリを割り当てると、Album_Categoriesモデルで保存されます。私はギャラリーモデルがどのようなカテゴリーが存在するかを認識し、どのカテゴリーを使用したいかを選択できるようにしたい。

カテゴリを選択すると、カテゴリに関連付けられたアルバムと、アルバムの画像がリンクされ、Album_Imagesの結合テーブルにアクセスできるようになります。カテゴリは、最初に作成されたアルバムまたはギャラリーが削除されても、別のアルバムまたはギャラリーで後で利用できるようにしても、引き続き存在することができます。

私の感覚は、一意のカテゴリが作成されると、Category_Galleriesモデルを介してGalleryに接続する方法が異なりますが、GalleryとAlbumにそれぞれ独自の結合テーブルを使用して接続されているImageを使用する場合、Galleryは認識しませんAlbum_images接続なので、他の人が作成したカテゴリの知識を共有することは同じであると思います。

私がこれを理解できないようにするための方法はありがたいです。

編集:モデルコード

class User < ActiveRecord::Base 
    has_many :images, dependent: :destroy 
    has_many :galleries, dependent: :destroy 
    has_many :albums, dependent: :destroy 
    has_many :categories, dependent: :destroy 
    accepts_nested_attributes_for :images, :galleries, :albums, :categories, allow_destroy: true 
    accepts_attachments_for :images, attachment: :file, append: true 
end 



class Image < ActiveRecord::Base 
    belongs_to :user 

    has_many :gallery_images, dependent: :destroy 
    has_many :galleries, through: :gallery_images 

    has_many :album_images, dependent: :destroy 
    has_many :albums, through: :album_images 

    attachment :file, type: :image 
    validates :file, presence: true 
end 

class Album < ActiveRecord::Base 
    belongs_to :user 
    validates :user_id, presence: true 

    has_many :album_galleries 
    has_many :galleries, through: :album_galleries # , dependent: :destroy 

    has_many :album_images, dependent: :destroy 
    has_many :images, through: :album_images 

    has_many :album_categories 
    has_many :categories, through: :album_categories 

    accepts_attachments_for  :images, attachment: :file, append: true 
    accepts_nested_attributes_for :images 
end 

class Gallery < ActiveRecord::Base 
    belongs_to :user 
    validates :user_id, presence: true 

    has_many :gallery_images, dependent: :destroy 
    has_many :images, through: :gallery_images 

    has_many :album_galleries, dependent: :destroy 
    has_many :albums, through: :album_galleries 

    accepts_attachments_for  :images, attachment: :file, append: true 
    accepts_nested_attributes_for :images 
end 

class Category < ActiveRecord::Base 
    belongs_to :user 
    validates :user_id, presence: true 

    has_many :albums, through: :album_categories 
    has_many :album_categories 
end 

class GalleryImage < ActiveRecord::Base 
    belongs_to :gallery 
    belongs_to :image 
end 
class AlbumCategory < ActiveRecord::Base 
    belongs_to :category 
    belongs_to :album 
end 
class AlbumGallery < ActiveRecord::Base 
    belongs_to :gallery 
    belongs_to :album 
end 
class AlbumImage < ActiveRecord::Base 
    belongs_to :album 
    belongs_to :image 
end 
+0

モデルのコード、具体的には関連付けの定義を追加してください。 –

+0

ギャラリーには独自の画像セットがありますか、それとも関連するすべてのアルバム画像によって推測されますか? – hypern

+0

カテゴリがギャラリーに関連付けられ、カテゴリがアルバムに関連付けられている場合、ギャラリーのすべてのカテゴリのすべてのアルバムのすべての画像をチェックすることによって、ギャラリーに代わって関連付けられたすべての画像を見つけることができます。 – hypern

答えて

1

それは本当にあなたがモデル化しようとしている要件に依存します。これはあなたの要件を正確に反映していますか?ギャラリーは多くのカテゴリで構成することができます

  • (現在の瞬間のためのユーザーを無視し、必ずしもレールの関連付けを詳述しない)
  • カテゴリには、アルバムは多くの画像
を持つことができ、多くのアルバム
  • を含めることができます

    もしそうなら、あなたは単にかもしれない:

    • にhas_manyをギャラリーや猫との会合を介しアルバムや画像
    • 間の会合を介しアルバムおよびカテゴリ
    • has_manyの間の会合を介しegories
    • にhas_many

    にhas_manyまでは、関係が破壊された後も、あなたのカテゴリ、ギャラリー、アルバムや画像が存在することができます。

    現時点では、STIや多型の必要はありません。通常は、2つのモデルが同じテーブルを共有(所有)している場合に、多相関連を使用します。しかし、関連を通してhas_manyを使用するので、多態性は必要ではありません。 (これは、所有テーブルの外部キーとして発生したときに所有テーブルIDの衝突を防ぎます)。

    たとえばギャラリーから画像を取得するには、ギャラリーに割り当てられているすべてのカテゴリに属する​​すべてのアルバムのすべての画像が表示されます。これは、関連付けとクエリによって実行できます。

    基本的に、あなたのシナリオは...私の理解に基づいているとは思えません...複雑すぎるので、団体交渉で十分です。

    興味深い質問は、ユーザーがすべてのモデルに関連付けられている理由です。ユーザーが関連付けられているモデルインスタンスを作成する責任はありますか?

  • +0

    最後の質問は分かりませんが、間違っているかどうかは分かりませんが、それらのインスタンスを作成していないユーザーのインスタンスからこれらのインスタンスが保護されているかどうかはわかりません。だから、もしuser1がアルバムと画像でいっぱいのギャラリーを作ったなら、user2はuser1のギャラリーなどを見ることができませんでした。私が過労したことは何ですか?また、残りの情報もありがとう、私はそれを適用する方法と私がchageに必要なものについて考えようとしています。 – Lenocam

    +0

    あなたの提案では、ギャラリーにカテゴリ「魚」があり、アルバムにカテゴリ「魚」があると言うと、 @ gallery.categoriesの "Fish"インスタンス(名前: "Fish")== @ album.categories(名前: "Fish")ですか?もしそうなら、私は前進する方法を知っていると思います。もしそうでなければ、私はそれらを互いに同等にするために何をする必要がありますか? – Lenocam

    +0

    ユーザーの関連性には何も問題はありません。私は単になぜ、あなたが言ったことが完全に意味を成しているのか不思議でした。ギャラリーを作ったユーザーが同じで、アルバム、単にギャラリーにuser_idを入れ、関連からそれを推測するだけです。 – hypern