基本上:我的模型需要至少存在一个关联模型的实例。我应该使用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
,但我想知道我是否需要对此保持谨慎。