Переопределяющий идентификатор на создает в ActiveRecord

Причина этого в том, что вы запускаете цикл for в потоке отправки событий (см. Событие Dispatch Thread ). Это поток, в котором происходят все взаимодействия с пользовательским интерфейсом.

Если вы выполняете длинную задачу, вы должны запустить ее в другом потоке, чтобы пользовательский интерфейс сохранял отзывчивость. Если вам нужно внести изменения в пользовательский интерфейс, например, изменить текст в вашей JTextPane и установить позицию каретки из другого потока, кроме потока отправки событий, вам нужно вызвать либо EventQueue.invokeLater(), либо EventQueue.invokeAndWait() (см. EventQueue ).

Я думаю, что инициируемые события от установки позиции каретки поставлены в очередь в вашем случае и могут обрабатываться только после завершения цикла (поскольку оба они обрабатываются в потоке отправки событий). Поэтому вы должны попробовать что-то вроде этого:

@Override
public void actionPerformed(ActionEvent e)
{
  new Thread(new Runnable() {
    @Override
    public void run() {
      for (int i = 0; i < iter; i++)
      {
        final String display = String.format("%10d\n", i);
        try {
          EventQueue.invokeAndWait(new Runnable() {
            @Override
            public void run() {
              append(display);
            }
          });
        } catch (Exception e) {
          e.printStackTrace();
        }
      } // end for i
    }
  }).start();
} 

Может быть даже лучше, если вы вызываете EventQueue.invokeAndWait только после x итераций и кешируете предыдущие результаты, которые необходимо отобразить.

103
задан Codebeef 10 January 2009 в 19:44
поделиться

4 ответа

id просто attr_protected, поэтому вы не можете использовать массовое назначение для его установки. Однако при настройке вручную он просто работает:

o = SomeObject.new
o.id = 8888
o.save!
o.reload.id # => 8888

Я не уверен, какова была исходная мотивация, но я делаю это при преобразовании моделей ActiveHash в ActiveRecord. ActiveHash позволяет использовать ту же семантику own_to в ActiveRecord, но вместо того, чтобы выполнять миграцию и создавать таблицу и нести накладные расходы на базу данных при каждом вызове, вы просто сохраняете свои данные в файлах yml. Внешние ключи в базе данных ссылаются на идентификаторы в памяти в yml.

ActiveHash отлично подходит для раскрывающихся списков и небольших таблиц, которые меняются нечасто и изменяются только разработчиками. Поэтому при переходе от ActiveHash к ActiveRecord проще всего сохранить все ссылки на внешние ключи одинаковыми.

117
ответ дан 24 November 2019 в 04:08
поделиться

Попробуйте

a_post = Post.new do |p| 
  p.id = 10
  p.title = 'Test'
  p.save
end

, который должен дать Вам, что Вы ищете.

29
ответ дан PJ Davis 5 November 2019 в 11:18
поделиться

На самом деле оказывается что выполнение следующих работ:

p = Post.new(:id => 10, :title => 'Test')
p.save(false)
6
ответ дан Codebeef 24 November 2019 в 04:08
поделиться

Как объяснил ранее, это вызвано Cleartype в Internet Explorer - но есть обходной путь, который по крайней мере сделает этот вопрос терпимой.

$('#navigation').fadeIn(500, function(){
    if ($.browser.msie){this.style.removeAttribute('filter');}
});

, что должно привести то, чтобы очистить прозрачность и, таким образом, сделать текст нормально.

Это все еще не красиво, к сожалению.

-121--3465255-

Как отмечает Джефф, удостоверение личности ведет себя так, как будто это attr_protected. Чтобы предотвратить это, вам необходимо переопределить список атрибутов защищенных по умолчанию. Будьте осторожны, делая это где-нибудь, что информация о атрибуте может прийти снаружи. Идентификационное поле защищено по умолчанию по умолчанию по умолчанию.

class Post < ActiveRecord::Base

  private

  def attributes_protected_by_default
    []
  end
end

(Испытано с Activerecord 2.3.5)

6
ответ дан 24 November 2019 в 04:08
поделиться
Другие вопросы по тегам:

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