В рельсах 4
Student.
find_or_initialize_by(:user_id => current_user.id).
update_attributes!(:department => 1)
Я решил эту проблему, добавление списка в мой класс перехватчика, который заполняется объектами во время реализации OnSave
.
В реализации PostFlush
список повторяется, и каждый элемент проверяется как вставка. Объекты в этом списке сохранены в PostFlush ()
и, таким образом, сгенерированы идентификаторы.
Кажется, это работает нормально, но я был бы признателен, если бы были указаны какие-либо потенциальные ловушки: -)
public class AuditInterceptor : EmptyInterceptor
{
// To hold inserted items to be audited after insert has been flushed
private IList<object> insertItems = new List<object>();
public override void PostFlush(System.Collections.ICollection entities)
{
foreach (var entity in insertItems)
{
AddAuditItem(entity, INSERT);
}
insertItems.Clear();
base.PostFlush(entities);
}
public override bool OnSave(object entity, object id, object[] state,
string[] propertyNames, IType[] types)
{
var auditable = entity as IAuditable;
if (auditable != null)
insertItems.Add(entity);
return false;
}
}
попробуйте метод OnFlushDirty
.. или, может быть, PostFlush
edit: также, можете ли вы опубликовать свой код? Разве вы не получаете идентификатор в качестве параметра на OnSave
?