Как я могу избежать запуска обратных вызовов ActiveRecord?

Я провел небольшой эксперимент, поставив ваш смайлик в 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

Возможно, вам придется экспериментировать с различными смайликами, с которыми вы сталкиваетесь, и составить список в своей заменяющей рутине.

136
задан user2262149 28 August 2018 в 06:11
поделиться

7 ответов

Этим решением являются направляющие 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)

Это - определенно что-то, что Вы только действительно захотите использовать в консоли или при выполнении некоторых случайных тестов.Надеюсь, это поможет!

72
ответ дан 23 November 2019 в 23:36
поделиться

Не самый чистый путь, но Вы могли перенести код обратного вызова в условие, которое проверяет среду направляющих.

if Rails.env == 'production'
  ...
-3
ответ дан 23 November 2019 в 23:36
поделиться

Почему Вы хотели бы смочь сделать это в разработке? Конечно, это будет означать, что Вы создаете свое приложение с недопустимыми данными и как таковые, это будет вести себя странно и не, как Вы ожидаете в производстве.

Если бы Вы хотите заполнить свой dev дб с данными, лучший подход должен был бы создать задачу граблей, которая использовала драгоценный камень обманщика, чтобы создать допустимые данные и импортировать его в дб, создающий столько или немного записей, сколько Вы требуете, но если Вы - наклон пятки к нему и имеете серьезное основание, я предполагаю, что update_without_callbacks и create_without_callbacks будут хорошо работать, но когда Вы попытаетесь изогнуть направляющие к своему желанию, для выяснения у себя у Вас есть серьезное основание и если то, что Вы делаете, является действительно хорошей идеей.

0
ответ дан 23 November 2019 в 23:36
поделиться

Вы могли попробовать что-то вроде этого в своей модели Person:

after_save :something_cool, :unless => :skip_callbacks

def skip_callbacks
  ENV[RAILS_ENV] == 'development' # or something more complicated
end

Править: after_save не является символом, но это - по крайней мере, 1,000-й раз, когда я попытался сделать его один.

17
ответ дан 23 November 2019 в 23:36
поделиться

Единственный способ предотвратить все 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
7
ответ дан 23 November 2019 в 23:36
поделиться

Другой способ - использовать перехватчики проверки вместо обратных вызовов. Например:

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)
0
ответ дан 23 November 2019 в 23:36
поделиться

Похоже, что одним из способов справиться с этим в Rails 2.3 (поскольку update_without_callbacks больше нет и т. Д.) Было бы использование update_all, который является одним из методов который пропускает обратные вызовы согласно раздел 12 руководства Rails по проверкам и обратным вызовам .

Также обратите внимание, что если вы делаете что-то в своем обратном вызове after_, который выполняет расчет на основе многих ассоциаций (например, has_many assoc, где вы также принимаете accept_nested_attributes_for), вам нужно будет перезагрузить ассоциацию, если как часть сохранения был удален один из его участников.

5
ответ дан 23 November 2019 в 23:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: