Я провел небольшой эксперимент, поставив ваш смайлик в Excel и запустив следующий код:
Dim s
s = ActiveCell
Dim i As Long
For i = 1 To Len(s)
Dim c
c = Mid(s, i, 1)
Debug.Print i, c, AscW(c)
Next i
Мой результат был
1 ? -10179
2 ? -8701
Так что, очевидно, один символ разделен в 2 внутри VBA. AscW
и его подвеска ChrW
имеют дело с 16-битным, а эмодзи - это 32-битный символ, поэтому в VBA этот символ эмодзи обрабатывается так, как если бы в строке было 2 символа
Я добавил следующий код и вуаля, смайлик-символ исчез:
Dim x
x = ChrW(-10179) & ChrW(-8701)
s = Replace(s, x, "(smiley)")
ActiveCell.Offset(0, 1) = s
Возможно, вам придется экспериментировать с различными смайликами, с которыми вы сталкиваетесь, и составить список в своей заменяющей рутине.
Этим решением являются направляющие 2 только.
Я просто исследовал это, и я думаю, что у меня есть решение. Существует два закрытых метода ActiveRecord, которые можно использовать:
update_without_callbacks
create_without_callbacks
Вы оказываетесь перед необходимостью использовать, отправляют для вызова этих методов. примеры:
p = Person.new(:name => 'foo')
p.send(:create_without_callbacks)
p = Person.find(1)
p.send(:update_without_callbacks)
Это - определенно что-то, что Вы только действительно захотите использовать в консоли или при выполнении некоторых случайных тестов.Надеюсь, это поможет!
Не самый чистый путь, но Вы могли перенести код обратного вызова в условие, которое проверяет среду направляющих.
if Rails.env == 'production'
...
Почему Вы хотели бы смочь сделать это в разработке? Конечно, это будет означать, что Вы создаете свое приложение с недопустимыми данными и как таковые, это будет вести себя странно и не, как Вы ожидаете в производстве.
Если бы Вы хотите заполнить свой dev дб с данными, лучший подход должен был бы создать задачу граблей, которая использовала драгоценный камень обманщика, чтобы создать допустимые данные и импортировать его в дб, создающий столько или немного записей, сколько Вы требуете, но если Вы - наклон пятки к нему и имеете серьезное основание, я предполагаю, что update_without_callbacks и create_without_callbacks будут хорошо работать, но когда Вы попытаетесь изогнуть направляющие к своему желанию, для выяснения у себя у Вас есть серьезное основание и если то, что Вы делаете, является действительно хорошей идеей.
Вы могли попробовать что-то вроде этого в своей модели Person:
after_save :something_cool, :unless => :skip_callbacks
def skip_callbacks
ENV[RAILS_ENV] == 'development' # or something more complicated
end
Править: after_save не является символом, но это - по крайней мере, 1,000-й раз, когда я попытался сделать его один.
Единственный способ предотвратить все after_save обратные вызовы состоит в том, чтобы иметь первый, возвращают false.
Возможно, Вы могли попробовать что-то как (непротестированный):
class MyModel < ActiveRecord::Base
attr_accessor :skip_after_save
def after_save
return false if @skip_after_save
... blah blah ...
end
end
...
m = MyModel.new # ... etc etc
m.skip_after_save = true
m.save
Другой способ - использовать перехватчики проверки вместо обратных вызовов. Например:
class Person < ActiveRecord::Base
validate_on_create :do_something
def do_something
"something clever goes here"
end
end
Таким образом вы можете получить do_something по умолчанию, но вы можете легко переопределить его с помощью:
@person = Person.new
@person.save(false)
Похоже, что одним из способов справиться с этим в Rails 2.3 (поскольку update_without_callbacks больше нет и т. Д.) Было бы использование update_all, который является одним из методов который пропускает обратные вызовы согласно раздел 12 руководства Rails по проверкам и обратным вызовам .
Также обратите внимание, что если вы делаете что-то в своем обратном вызове after_, который выполняет расчет на основе многих ассоциаций (например, has_many assoc, где вы также принимаете accept_nested_attributes_for), вам нужно будет перезагрузить ассоциацию, если как часть сохранения был удален один из его участников.