Я пытался выяснить, как связать свои модели с проектом, над которым я работал некоторое время, и я пришел сюда за помощью пару раз раньше, но у меня никогда не было удовлетворительного ответа. У меня две модели: Post и Image. Каждая запись имеет несколько изображений, прикрепленных к нему и сообщениям могут обмениваться изображениями, поэтому отношения HABTM имели смысл, что, как это:Rails признакам ассоциации изображений?
class Post < ActiveRecord::Base
has_and_belongs_to_many :images
end
class Image < ActiveRecord::Base
has_and_belongs_to_many :posts
end
Сейчас проблема заключается в том, что я хочу, чтобы каждый пост, чтобы иметь один «признаки изображения. ' Как мне это сделать? Первой мыслью, которая приходит на ум, является простой has_one :featured_image
на столбе и belongs_to :post_featured_on
на изображении, но проблема в том, что одно и то же изображение может отображаться на нескольких сообщениях.
Итак, следующая идея, которую я придумал, заключается в том, чтобы обратить вспять отношения: belongs_to :featured_image
на сообщение и has_many :posts_featured_on
на изображение. Проблема в том, что он не очень семантический, и рельсы, похоже, не хотят позволять мне устанавливать отображаемое изображение из его формы, как это в контроллере: Post.new(:featured_image => Image.find(params[:image_id]))
Итак, следующая идея мне предложила было вторым отношением HABTM, например: has_and_belongs_to_many :featured_images
. Там есть очевидная проблема, это множественное число. Я попытался поставить unique: true
в столбец post_id в процессе миграции, но это не помогло мне в том, что я продолжал делать это в своем коде: post.featured_images.first
, что может быть очень неприятно.
Последняя идея, которую я попытался было has_many :posts, through: :attachment
и has_one :featured_posts, through: :attachment
вместо оригинального HABTM, но это только кажется излишне громоздким, и рельсы, кажется, не хочет меня назначить изображений на лету так, как Post.new(:featured_image => Image.find(params[:image_id]))
.
Есть ли хороший способ сделать это? Я сделал что-то не так в моих предыдущих попытках? Разве это не просто простой внешний ключ на стол стол? Почему это должно быть так сложно?
Мне это нравится, но мне не нравится откормить контроллер. Кстати, я использую Rails 4, поэтому нет attr_accessible. –
Это то, что я собираюсь. –