2013-03-05 3 views
2

У меня есть модель и таблица, которые, я считаю, отлично подходят для STI. Моя таблица называется Finances и имеет два типа: Доходы и расходы. Кроме type есть еще три столбца: description, amount и date.Альтернатива Rails Single Table Inheritance (STI)?

Я очень нервничаю, используя STI в Rails, так как это требует некоторого взлома. Я слишком новичок в Rails, чтобы взломать код. Хотя это работает, я не понимаю. Это кажется опасным.

Мой вопрос: как настроить свою модель, контроллер и просмотр, если я НЕ использую STI? Любые лучшие практики для групповых элементов в моей модели? Или я просто делаю Finances.where("type = 'Income'") перед настройкой представления?

Редактировать: Я сделал gist, чтобы показать код, с которым я работаю. Когда я запускаю его, я получаю ошибку:

undefined method `incomes_path' for #<#<Class:0x007fbc95f60b40>:0x007fbc93883220> 

ответ

4

Во-первых, с помощью STI является стандартным для Rails, так что нет никакой необходимости чувствовать себя нервничать. И не нужно «взломать». Он был очень успешно использован многими разработчиками. И, как вы видели, вы можете найти учебники и общую информацию в сети.

Если с другой стороны, вы решили не использовать STI, у вас есть выбор использования
(а) полностью отдельные модели со своими собственными таблицами, что приведет к много дублированного кода или
(b) создать вас "STI-like" поведение от руки. Второй вариант, по крайней мере, может быть интересным, чтобы узнать больше о Rails.

Например, в вашей Finances модели вы бы определить область incomes, как

scope :incomes, where(:type => 'Income') 

, то вы можете сделать Finances.incomes.

Затем, если у вас есть методы, которые применяются только к одному из типов, вы должны убедиться, что все записи имеют нужный тип.

Лично я бы посоветовал вам использовать STI. Вы получаете много функциональности бесплатно, и вы делаете это Rails way. Представьте себе, например, что другие разработчики читают ваш код, они спросят себя, почему вы не использовали STI, обвиняете его в невежестве и, если нужно, реорганизуйте его с помощью STI.

+0

Хорошо, вы убедили меня продолжать продвигать STI. Я думаю, что у меня есть часть модели, но я смущен, когда использую ее в контроллере или в представлении. Если вы не возражаете, я бы хотел опубликовать некоторый код в Github позже сегодня, чтобы вы могли увидеть, где я ошибаюсь. – Casey

+1

вы также можете опубликовать его на http: //codereview.stackexchange.com – kr1

+0

Эй, извините за пост зомби, но как вы думаете, @ kr1 полиморфного наследования? Для справки я делаю приложение с врачами и больницами, двумя отдельными группами пользователей. Вы использовали те или еще STI по-прежнему Rails? –

0

STI лучше, если вы используете структуру наследования следующим образом. Вам не нужно использовать Finances.where("type = 'Income'"). Вы можете просто использовать Income.all. см. эти сообщения, если они вам помогут. http://www.therailworld.com/posts/18-Single-Table-Inheritance-with-Rails http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/

+0

Но как насчет использования form_for? http://henrik.nyh.se/2012/08/rails-sti-and-form-for/ Я нашел в этой статье мне нужно использовать object.becomes, чтобы заставить его работать с STI. В конце статьи автор говорит, что этот метод является хрупким, поэтому не забудьте его протестировать. – Casey

Смежные вопросы