Validates_presence_ of предпочтительного метода, требующего отношения has_many - PullRequest
1 голос
/ 23 февраля 2011

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

...