しばらく取り組んできたプロジェクトに自分のモデルを関連付ける方法を見つけようとしており、以前に数回助けを求めてここに来ましたが、満足のいく答えは得られませんでした. Post と Image の 2 つのモデルがあります。すべての投稿には複数の画像が添付されており、投稿は画像を共有できるため、次のように HABTM 関係が理にかなっています。
class Post < ActiveRecord::Base
has_and_belongs_to_many :images
end
class Image < ActiveRecord::Base
has_and_belongs_to_many :posts
end
ここでの問題は、各投稿に 1 つの「注目の画像」を含めることです。どうすればいいですか?頭に浮かぶ最初の考えはhas_one :featured_image
、投稿とbelongs_to :post_featured_on
画像に関する単純なことですが、それの問題は、同じ画像が複数の投稿で取り上げられる可能性があることです.
そこで私が思いついた次のアイデアはbelongs_to :featured_image
、投稿とhas_many :posts_featured_on
画像の関係を逆にすることです。それに関する問題は、それがあまりセマンティックではなく、Rails が、コントローラーで次のように、フォームから投稿の注目の画像を設定できるようにしたくないように見えることです。Post.new(:featured_image => Image.find(params[:image_id]))
そこで私に提案された次のアイデアは、次のような 2 番目の HABTM 関係でしたhas_and_belongs_to_many :featured_images
。これには明らかな問題があります。複数形です。移行で post_id 列を追加しようとunique: true
しましたが、コード内でこれを実行しなければならないという事実が改善されませんでしたpost.featured_images.first
。これは非常にイライラする可能性があります。
私が最後に試したアイデアは、元の HABTM の代わりにhas_many :posts, through: :attachment
andを使用することでしたhas_one :featured_posts, through: :attachment
が、これらは不必要に面倒なようで、Rails は のようにその場で画像を割り当てることを望んでいないようですPost.new(:featured_image => Image.find(params[:image_id]))
。
これを行う良い方法はありますか?以前の試行で何か間違ったことをしましたか? これは、post テーブルの単純な外部キーであってはなりませんか? なぜそんなに難しくなければならないのですか?