Вы должны обязательно сохранить эту логику в модели, и на самом деле, если логика существенно различается для разных типов, вы должны использовать несколько моделей с наследованием одной таблицы.
См .: http://joemcglynn.wordpress.com/2009/12/11/rails-sti-part-1/http://joemcglynn.wordpress.com/2009/12/12/rails-single-table-inheritance-part-2/
По сути, идея такова: вы уже определяете тип продукта - столбец «тип» является основной функцией таблицы STI.
С STI вместо одногоВ модели с тоннами условной логики или несколькими моделями у вас есть несколько ОЧЕНЬ ПОДОБНЫХ моделей с ОЧЕНЬ ПОДОБНЫМИ данными, но несколько отличной логикой, поэтому все эти связанные модели могут использовать одну и ту же таблицу и наследовать от общего класса.
Например:
class Product < ActiveRecord::Base
...
common logic goes here
...
end
class PhysicalProduct < Product
...
physical-product-specific logic goes here
...
end
class VirtualProduct < Product
...
virtual-product-specific logic goes here
...
end
Таким образом, вы можете создать метод, подобный product.deliver
, который определен по умолчанию в модели продукта, чтобы инициировать доставку продукта, но в модели VirtualProduct переопределяетсявместо этого инициировать отправку по электронной почте ссылки на скачивание.
ActiveRecord обрабатывает все это очень хорошо (см.выше, для ознакомления), и большинство ваших форм, ссылок, контроллеров и т. д. будут продолжать работать так же, как в настоящее время.
В общем, вы всегда хотите сохранить столько логики, скольковозможно в моделях вместо контроллеров, потому что модели легче тестировать и легче отлаживать. В вашей ситуации STI - хороший способ сохранить эту логику ветвления в моделях вне контроллеров и представлений.