2013-04-18 5 views
0

Если у меня есть модели, как это:Single Table Inheritance с проверкой рубин на рельсах

class Transaction < ActiveRecord 
    # create table called transactions and add type column to it. 
    # add common methods inside this class 
end 

class CashTransaction < Transaction 
    # the type column will be CashTransaction and used to determine entry for this class in transactions table 
end 

class CreditCardTransaction < Transaction 
    validates :settled, :presence => true 
    # the type column will be CreditCardTransaction and used to determine entry for this class in transactions table 
end 

Как я могу применить проверку, что является уникальным для CreditCardTransaction? Таким образом, транзакция родительского класса и CashTransaction не нуждается в проверке того, была ли транзакция решена?

+0

Вы находитесь на Rails 3 или Rails 4? Этот вопрос отмечен как оба. – Substantial

ответ

0

Хм ... Я думаю, у вас есть столбец, указывающий, что это CreditCardTransation. Таким образом, вы можете использовать валидатор внутри рамки:

Rails 3 Validation with Scope Conditions

2

Ваш пример кода является правильным.

В Rails 3 проверки, вызываемые в подклассе, будут применяться только к экземпляру этого подкласса (в дополнение к проверке суперкласса). Подтверждения суперкласса применяются ко всем подклассам.

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