В моем приложении у меня есть класс Budget. Бюджет может быть многих типов. Например, скажем, что есть два бюджета: FlatRateBudget и HourlyRateBudget. Оба наследуются от класса Budget.
Это то, что я получаю до сих пор:
class Budget < ActiveRecord::Base
validates_presence_of :price
end
class FlatRateBudget < Budget
end
class HourlyRateBudget < Budget
validates_presence_of :quantity
end
В консоли, если я это сделаю:
b = HourlyRateBudget.new(:price => 10)
b.valid?
=> false
b.errors.full_messages
=> ["Quantity can't be blank"]
Как ожидалось.
Проблема в том, что поле "type", в STI, происходит из параметров. Поэтому мне нужно сделать что-то вроде:
b = Budget.new(:type => "HourlyRateBudget", :price => 10)
b.valid?
=> true
Это означает, что рельсы запускают проверки в суперклассе вместо создания экземпляра подкласса после того, как я установил тип.
Я знаю, что это ожидаемое поведение, так как я создаю класс, который не нуждается в поле количества, но мне интересно, есть ли вообще сказать rails для запуска проверки для подкласса, а не супер.