Для получения копии используйте клон (или дубликат для направляющих 3.1) метод:
# rails < 3.1
new_record = old_record.clone
#rails >= 3.1
new_record = old_record.dup
Тогда можно измениться, какой бы ни поля Вы хотите.
ActiveRecord переопределяет встроенный Object#clone, чтобы дать Вам новое (не сохраненный к DB) запись с неприсвоенным идентификатором.
Примечание, что это не копирует ассоциации, таким образом, необходимо будет сделать это вручную, если Вы должны.
направляющие 3,1 клона являются мелкой копией, используйте дубликат вместо этого...
(Я отвечаю на свой вопрос здесь, чтобы спасти себя в следующий раз или кого-либо еще, дни возни, которые мне понадобились, чтобы найти ответ.)
Что действительно нужно, чтобы изменить способ разрешения DTD, так это EntityResolver
. К сожалению, невозможно настроить EntityResolver
, который будет использоваться Transformer
. Таким образом, вы должны сначала создать XMLReader
с CatalogResolver
в качестве EntityResolver
:
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
XMLReader r = spf.newSAXParser().getXMLReader();
EntityResolver er = new CatalogResolver();
r.setEntityResolver(er);
и использовать его для Transformer
:
SAXSource s = new SAXSource(r, xmlSrc);
Result res = new SAXResult(myDefaultHandler());
transformer.transform(s, res);