2016-08-19 4 views
0

私のモデルには、多数の画像を持つ店舗が含まれています。 (イメージを持つことができる他のモデルもあります。) Storeに割り当てられているすべての画像のうち、最初にStoreのページに表示される「メイン画像」を設定したいと思います。それ以外の場合、主画像は他の画像と同じように扱われるべきです。Rails:店舗には多くの画像があります。 "メインイメージ"を定義するベストプラクティス?

ベストプラクティスは何ですか?

モデルは、基本的に次のようになります。

class Store < ActiveRecord::Base 
    has_many :images, as: :imageable, dependent: :destroy 
end 

class Image < ActiveRecord::Base 
    belongs_to :imageable, polymorphic: true 
end 

答えて

0

あなたは画像がメインである場合に定義するために、あなたのイメージモデルにいくつかのブール型フィールドを追加し、にあなたのモデルにスコープを追加することができますその新しいブールフィールドでメインイメージを取得する

+0

代わりに、Image idを含むStoreモデルに外部参照を追加することを考えました。私は、 "main_image_id"が "imageable"が正確にそのストアであるImageを参照することを検証しなければならないでしょう。しかし、私はこのシナリオでベストプラクティスとみなされるものに固執したいと思います。 – rubykatz

1

ストアテーブルに外部キーリファレンスを追加することは、実際には悪い考えではありません。

RBDMSではなくソフトウェア層で多相関係が解決されるため、参照整合性を維持するDBには何もありません。 DBは、例えば、店舗のプライマリイメージを幸せに削除させます。

まず移行を生成することができます:

class AddPrimaryImageToStores < ActiveRecord::Migration[5.0] 
    def change 
    # we need to setup the foreign_key manually 
    add_reference :stores, :primary_image, foreign_key: false 
    add_foreign_key :stores, :images, column: 'primary_image_id' 
    end 
end 

が続いてセットアップをすることができます関係:

class Store < ActiveRecord::Base 
    has_many :images, as: :imageable, dependent: :destroy 

    belongs_to :primary_image, class_name: 'Image' 
end 

class Image < ActiveRecord::Base 
    belongs_to :imageable, polymorphic: true 

    # one to one. 
    has_one :primary_store, class_name: 'Store' 
          foreign_key: 'primary_image_id' 

end 

外部キーとの直接的な関係は、あなたは非常に効果的な実行することができますが、あなたならば、特に重要である加入ストアとプライマリイメージを一緒に表示しています。

+0

ありがとうございます!これは参考になります。しかし、私は、一対一が明白にする必要があるかどうかはわかりません。イメージは1つにしか属しません:imageableなので、primary_storeは常にimageableと同じでなければなりません(私が何かを誤解している場合を除きます)。編集:ああ待って - 1つのストアは多くの画像を持つことができますが、それはまだ、右ではないので、任意の画像は1つのストアだけ明示する必要があるという事実?だから私はそれを行う必要があります:イメージング可能な? – rubykatz

+0

1対多のリレーションシップを持たせたい場合は、storeとimageableの間の関係は問題ありません。それは私が得ているものではありません。すべての店舗をリストし、それを主画像で表示するようなことをしたいのであれば、効果的に結合できる非多相関係が必要です。 – max

+0

最大、店舗でのプライマリイメージのイメージを破壊しないようにするにはどうすればよいですか?また、プライマリイメージを持つテーブルのような別のストアを持っている場合は、新しいhas_oneを追加する必要があります。 – hurrycaner

関連する問題