单表继承与rails上的验证ruby

时间:2013-04-18 22:11:41

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

如果我有这样的模型:

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独有的验证?那么父类Transaction和CashTransaction不需要验证交易是否已经结算?

2 个答案:

答案 0 :(得分:2)

您的示例代码是正确的。

在Rails 3中,子类中调用的验证仅适用于该子类的实例(除了超类验证)。超类验证适用于所有子类。

请记住,在使用STI时只能使用子类。换句话说,从不出于任何原因实例化超类。这样做会干扰Rails的内部STI魔术酱,让你有意想不到的行为和丑陋的黑客让你的事情再次发挥作用。

答案 1 :(得分:0)

嗯...我想你有一个列,表明这是CreditCardTransation。所以你可以在范围内使用验证器:

Rails 3 Validation with Scope Conditions