В основном: моя модель требует наличия хотя бы одного экземпляра связанной модели.Должен ли я использовать 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
, но мне интересно, нужно ли мне быть осторожнее с этим.