2014-10-02 1 views
0

У меня STI, как это:Как переназначить класс STI переменной в методе модели?

class Post 
end 

class Post::Confirmed < Post 
end 

class Post::Draft < Post 
    def confirm! 
    becomes Post::Confirmed 
    end 
end 

...# somewhere in controller 
# POST /posts/1/confirm 
# POST /posts/1/confirm.json 
def confirm 
    @post = Post::Draft.first 
    @post = @post.confirm! # this is the only way I can reload @post with Post::Confrmed 
end 

ли это как-то можно сделать:

@post.confirm! # I want this @post(Post::Draft) to become Post::Confirmed without reassigning 

Или это просто ни RoR путь?

Заранее благодарен!

+2

Вы уверены, что STI подходит в этом случае? Разве не был бы понятен простой флаг состояния и некоторые области? –

+0

У меня есть об этом, но область действия немного больше, чем в этом примере: все подклассы работают как пространства имен для заданных классов, поэтому проекты имеют свои собственные методы и подтвержденные сообщения - свои собственные. Я думаю, я могу ошибаться. Но все же STI отлично подходит для этого. – IlyaDoroshin

+0

@muistooshort представьте, что у вас есть корзина для покупок. Это структурно то же самое, что и Order: у него есть предметы, общая цена и т. Д. Но методы для каждого класса разные. – IlyaDoroshin

ответ

0

Образец, который я нашел, который лучше всего работает здесь, имеет поле типа datetime, которое записывает, когда запись была отмечена.

Например:

def confirm! 
    self.confirmed_at = DateTime.now 
    self.save! 
end 

Тогда вы можете сказать когда что-то было подтверждено. Это особенно удобно, когда у вас есть ситуация, когда что-то будет помечено, но пока не указано, например, установка даты публикации в будущем.

Хотя может показаться немного раздражающим, что у вас нет пакета трюков STI, STI не всегда является подходящим инструментом. Как правило, STI - это различие между подобными, но разными моделями, которые имеют много общего или используются в общем контексте. Он не должен использоваться для обработки разных состояний сингулярной модели.

Что вы хотите в этом случае - это шаблон типа государственного устройства.

+0

На самом деле, правда, но государственные машины драгоценные камни ужасны: государственный деятель слишком сложный в использовании, а state_machine не поддерживается в течение года .. все, что я хотел использовать метод «bang», который изменит экземпляр (так как все удары -методы). Но если это невозможно, я буду придерживаться переназначения переменной. Для меня этот путь более ясен и прочен. Спасибо за ваш ответ, хотя) – IlyaDoroshin

+0

Я только что нашел другой драгоценный камень, который выглядит перспективным на самом деле: aasm – IlyaDoroshin

+1

Причина, по которой драгоценности типа государственной машины не всегда хороши, заключается в том, что реализация этого поведения тривиально. Дать ему шанс. – tadman