Есть ли способ делегировать методы «активной» модели соединения? - PullRequest
0 голосов
/ 10 октября 2011

Предположим, у меня есть посты, в которых есть много категорий по категориям.Предположим, что я добавляю логический столбец primary к categorizations, чтобы определить основную категорию сообщения.Но теперь я застрял, имея дело с моделью соединения, когда я действительно хотел бы сделать что-то вроде этого:

post = Post.first
primary_cat = post.categories.where(:primary => true)

post.categories.first.primary = true
post.save # would actually update the categorization, setting primary = true

Я могу привести множество примеров, чтобы показать, почему это так.быть полезным, но по сути я хочу иметь возможность взаимодействовать с моделью, как будто она каким-то образом объединена с ее моделью соединения.Возможность сказать "Какая основная категория?"или «ОК, эта категория будет основной», даже не касаясь модели соединения, и я думаю об этом интуитивно.

Возможно ли это даже с Rails?Кто-нибудь видел попытки сделать что-то подобное раньше?

Ответы [ 4 ]

1 голос
/ 11 октября 2011

Мне нравится решение квеста, за исключением того, что оно должно быть post.primary_category= и должно принимать объект категории. Просто установите has_one :primary_category на пост, и вы золотой.

1 голос
/ 10 октября 2011

Краткий ответ - создать метод set_primary (post) для категории, который в качестве аргумента использует post и логическое значение.

def set_primary(post)
  categorization = post.categorization.where('your opts hash here')
  categorization.primary = true
  categorization.save!
end


post.categories.first.set_primary(post)
1 голос
/ 11 октября 2011

У Чарли Боумена действительно есть первая часть головоломки с логикой 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, поскольку она просто не нужна.

0 голосов
/ 10 октября 2011

этот вопрос, вероятно, является дубликатом Ruby on Rails: attr_accessor для подмоделей , но в основном делегат должен быть тем, что вы ищете, с дополнительным обратным вызовом при сохранении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...