Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 真的需要验证外键吗?_Ruby On Rails_Ruby_Validation_Activerecord_Associations - Fatal编程技术网

Ruby on rails 真的需要验证外键吗?

Ruby on rails 真的需要验证外键吗?,ruby-on-rails,ruby,validation,activerecord,associations,Ruby On Rails,Ruby,Validation,Activerecord,Associations,我正在使用RubyonRailsV3.2.2,在我的文章之后,我想知道并理解是否需要(或不需要)显式验证与ActiveRecord::Associations相关的外键。例如: class CategoryAssociation < ActiveRecord::Base belongs_to :article, :foreign_key => 'article_id' belongs_to :category, :foreign_key => 'category_id'

我正在使用RubyonRailsV3.2.2,在我的文章之后,我想知道并理解是否需要(或不需要)显式验证与
ActiveRecord::Associations
相关的外键。例如:

class CategoryAssociation < ActiveRecord::Base
  belongs_to :article, :foreign_key => 'article_id'
  belongs_to :category, :foreign_key => 'category_id'

  validates :article_id, :presence => true, :numericality => { :only_integer => true }
  validates :category_id, :presence => true, :numericality => { :only_integer => true }
end
class CategoryAssociation“article\u id”
属于:category,:foreign\u key=>“category\u id”
验证:article_id,:presence=>true,:numericality=>{:only_integer=>true}
验证:category_id,:presence=>true,:numericality=>{:only_integer=>true}
结束

上述
验证方法是否确实需要?为什么?

我不会像你那样做,但我会:

validates_presence_of :article, :category
我不确定这是否绝对必要,但这使您无法仅保存部分关联。在正常的rails使用中很难创建部分关联,但这样就不会发生

此外,您不需要在这些关联中的任何一个上使用
外键
,只要

belongs_to :article, :category

关联只有在描述现有文章和类别时才有意义。您需要这些约束来保持数据库的一致性。把一篇文章和“什么都没有”联系起来有什么意义呢?@Tom-我应该明确地说明验证方法吗(正如我在问题中所说的)?这不会给应用程序增加一些严重的开销吗?在db级别添加约束不是更好吗?这取决于你的应用程序和你如何定义严重的开销。如果这是面向用户的,并且用户一次只能处理几个记录,那么这不会增加可测量的影响。如果你作为一名管理员一次处理一百万条记录,那么这可能是一项有意义的开销。但是,如果你作为一名管理员一次要做一百万条记录,那么你可能不应该在应用程序代码中首先做这件事。