0

一連の画像と 1 つの注目の画像を含む投稿を含むブログに似た Rails プロジェクトがあります。複数の投稿で同じ画像を共有でき、1 つの投稿で多くの画像を使用できるため、画像セットは非常に単純な HABTM 関係でしたが、主役の画像は少し厄介でした。

すべての投稿にはアイキャッチ画像が 1 つだけある必要があり、1 つの画像が複数の投稿のアイキャッチ画像になる可能性があるため、最初に考えたのは関係を逆にして、画像has_manyを投稿して画像を投稿belong_toできるようにすることでしたが、それはさまざまな点で問題があるようです。 . まず、あまりセマンティックではありません。2 つ目は、post.new が image_id を属性として受け入れたくないように見えるため、post コントローラーが image_id の値を受け入れる追加のコードを必要とすることです。

私の 2 番目の考え (これは私がこれまで行ってきたことですlimit: 1) は、投稿の指定子has_and_belongs_to_many :featured_imagesと移行のunique: trueonの両方で HABTM 関係を使用することでしたt.belongs_to :post。このソリューションは機能しますが、ハックっぽいようです。post.featured_images.firstまた、ではなく、このように注目の写真にアクセスする必要があることを意味しますpost.featured_image。さらに悪いことに、2 つではなく 3 つのテーブルにアクセスする必要があり、ID を介してすぐに識別するのではなく、多対多テーブルで投稿 ID を検索する必要があるため、データベースのパフォーマンスが低下するのではないかと思わずにはいられません。桁。

それで、これはこれを行う正しい方法ですか、それとももっと良い方法がありますか? has_oneレールには,belongs_to_many関係のようなものがありますか?

4

2 に答える 2

3

そのようなことを試してみませんか (HABTM なしで、has_many だけ):

class Image < ActiveRecord::Base
  belongs_to :post
  attr_accessible :featured

  after_commit :reset_featured, if: :persisted?

  protected
  # garant that featured will be only one
  def reset_featured
    Image.where('id <> ?', self.id).update_all(featured: false) if self.featured
  end
end

class Post < ActiveRecord::Base
  has_many :images, conditions: { featured: false }
  has_one :featured_image, class_name: 'Image', conditions: { featured: true }
end
于 2013-08-28T20:24:50.350 に答える