在rails 4中为继承的模型添加验证

时间:2015-12-23 17:51:13

标签: ruby-on-rails validation model-view-controller

代码只是继承的模型。 但不幸的是验证不起作用。这个想法是从鹦鹉中选择父亲。当我循环@fathers时 - 它会显示所有鹦鹉,但应该只选择年龄超过12岁的鹦鹉等等。或者也许我做错了什么?

模型

  class Father < Parrot
  has_many :parrots
    validates :age, :numericality => { :greater_than => 12}
    validates :tribal, :acceptance => true
    validates_inclusion_of :sex, :in => %w( Male )
  end

视图

  <% @fathers.each do || %>
    <%= f.name %> 
  <% end %>

控制器

  def index
    @parrots = Parrot.all
    @fathers = Father.all
  end

2 个答案:

答案 0 :(得分:1)

验证标准与如何查询数据无关,只是它在将对象写入数据库之前传递了定义的条件。您是说Father对象没有执行验证并保留无效数据吗?

您确定通过Father对象保存了所有父亲鹦鹉吗?您的type列中还应该有一个parrots列,其中包含“Parrot&#39;或者父亲&#39;值。当您执行Father.all时,它应该运行如下所示的查询:

SELECT * FROM parrots WHERE type='Father';

过滤掉未通过Father对象保存的鹦鹉。

如果您只需要从数据库中提取符合Parrots条件的Father,则可以使用范围:

class Father < ActiveRecord::Base
   self.table_name = 'parrots'
   default_scope { where("age > 12 and tribal = 'true' and sex='Male'")}
   #whatever else
end

以下有关Single Table Inheritancescopes

的其他信息

答案 1 :(得分:0)

保存父时使用验证。 &#34;类型&#34; db中的列将确定该类。确保设置正确。

但是,Father真的是一个单独的类吗?或者只是具有特定属性的Parrot。似乎Parrot.all将包括所有父亲。

它可能是一个范围。

class Parrot < ActiveRecord::Base

  scope :fathers, -> { where(:sex => 'Male').where('age >= 12').where(:tribal => true) }

end

然后你可以通过

获得父亲
@fathers = Parrot.fathers