validates_presence_of是要求has_many关系的首选技术

时间:2011-02-22 21:42:04

标签: ruby-on-rails validation associations has-many has-and-belongs-to-many

基本上:我的模型需要至少存在一个关联模型的实例。我应该使用validates_presence_of断言此验证,还是应该编写一些自定义验证码?

以下是我的模型的要点:

class Event < ActiveRecord::Base
  has_and_belongs_to_many :channels
  validates_presence_of :channels, :message => "can't be empty"
end

(如果我使用has_many代替has_and_belongs_to_many,我会假设情况相同。)

而不是validates_presence_of行,我可以这样做:

def validate
  errors.add(:channels, "can't be empty") if channels.size < 1
end

我在Rails应用程序中用前者替换了后者,我想知道是否有任何问题。

所以更确定的是,我编写了以下rspec报道,两个实现都响应相同:

describe Event do
  before do
    @net = Factory.create(:network)
    @net_config = Factory.create(:network_config, :network => @net)
  end
  it "must have a channel" do
    e = Factory.build(:event, :network => @net, :channels => [])
    e.should have(1).error_on(:channels)
  end    
end

也就是说,如果删除验证码,则上述规范失败;如果我输入任一版本的验证码,则上述规范通过。

所以我可能会认为我的新实现没问题。但我已经读过validates_presence触发数据库加载,反过来会消除由嵌套属性构造的任何内存中对象。另一方面,proxy_target method将返回内存中的对象而不会触发加载。 proxy_target上的一些链接:http://rubydoc.info/docs/rails/ActiveRecord/Associations/AssociationProxy http://withoutscope.com/2008/8/22/don-t-use-proxy_target-in-ar-association-extensions

在我的特定情况下,我没有使用ActiveRecord::Relation,但我想知道我是否需要对此保持谨慎。

0 个答案:

没有答案