У Чарли Боумена действительно есть первая часть головоломки с логикой set_primary на модели Category, однако его сеттер не отменяет предыдущую активную категорию ... Кроме того, дорогая часть проблемы Стива, фактически только получает основная категория по каждому запросу. Чтобы обойти это, я бы также сохранил основной идентификатор категории на самом посте. Таким образом, вам не нужно обращаться к модели соединения, чтобы выяснить основную категорию.
def set_primary_category(post)
post.categorizations.each do |cat|
if cat.post == post
cat.primary = true
cat.save!
post.update_attribute(:primary_category_id, cat.category_id)
else
cat.update_attribute(:primary, false) if cat.primary
end
end
end
НАСТРОИТЬ:
post.categories.first.set_primary(post)
ДОСТУП К:
post.primary_category
К сожалению, я не думаю, что кто-то создал драгоценный камень, который облегчает вам выполнение, но логика довольно проста. Он также имеет преимущество в том, что имеет доступ к основному состоянию как в категоризации, так и в публикации, так что у вас всегда есть быстрый способ доступа к данным.
Кроме того, я думаю, что это хорошо запомнить. У вас есть много-много отношений для сообщений / категорий. Но только отношение has_one для post / primary_category. Всякий раз, когда у вас есть такой шаблон доступа, мне нравится стараться держаться подальше от модели соединения для has_one, поскольку она просто не нужна.