почему я получаю «неправильное количество аргументов (2 на 1)» после обновления с rails 2.0 до rails 2.3.3? - PullRequest
0 голосов
/ 03 декабря 2009

Это происходит в методе after_save в одной из моих моделей, PlayerAction. Я не изменил код во время обновления (последние известные слова). Похоже, что происходит в следующей строке:

if self.action_type.id == 1

Модель PlayerAction имеет

belongs_to :action_type

Изменение action_type.id на action_type_id исправило эту проблему, но та же проблема происходит в другом месте, в этой строке

player_action.action_type.desc

Вот трассировка полного стека, где проблема возникает в этой строке

C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/belongs_to_association.rb:49:in `find'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/belongs_to_association.rb:49:in `send'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/belongs_to_association.rb:49:in `find_target'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/association_proxy.rb:240:in `load_target'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/association_proxy.rb:112:in `reload'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations.rb:1219:in `action_type'
C:/InstantRails2-0/rails_apps/rftg/app/models/game.rb:164:in `full_xml'
C:/InstantRails2-0/rails_apps/rftg/app/models/game.rb:160:in `each'
C:/InstantRails2-0/rails_apps/rftg/app/models/game.rb:160:in `full_xml'
C:/InstantRails2-0/rails_apps/rftg/app/models/game.rb:156:in `full_xml'
C:/InstantRails2-0/rails_apps/rftg/app/models/game.rb:136:in `full_xml'
C:/InstantRails2-0/rails_apps/rftg/app/models/game.rb:86:in `full_xml'
C:/InstantRails2-0/rails_apps/rftg/app/controllers/games_controller.rb:33:in `show'
C:/InstantRails2-0/rails_apps/rftg/app/controllers/games_controller.rb:30:in `show'

ActionType - еще одна моя модель, и это довольно общее имя, как указано в другом ответе. Может ли это быть источником проблемы? Я заглянул в основную документацию по rails и не увидел класс или метод с именем ActionType или action_type.

Оказывается, я просто добавил собственный метод поиска для ActionType:

def self.find(id)
  Rails.cache.fetch(cache_key) { ActionType.find(id) }
end 

ActionType - это в основном статические данные, и я пытаюсь их кешировать. Существует около 10 строк для ActionType, и у меня есть несколько других моделей, которые имеют аналогичные статические данные. Вот и вся причина, по которой я начал процесс обновления рельсов, чтобы получить эту функцию кеширования. Я пытался найти пример того, как сделать это правильно. Очевидно, приведенный выше код не является правильным. Я нашел еще один вопрос о наилучшем способе обработки статических данных в модели, но он не совсем помог.

1 Ответ

2 голосов
/ 03 декабря 2009

попробуйте с

if self.action_type_id == 1

По крайней мере, вы будете знать, если это проблема.

Хорошо, учитывая, что это проблема, согласно комментариям, строка в Rails, от которой она умирает, находится здесь:

def find_target
      find_method = if @reflection.options[:primary_key]
                      "find_by_#{@reflection.options[:primary_key]}"
                    else
                      "find"
                    end
      @reflection.klass.send(find_method,
        @owner[@reflection.primary_key_name],
        :select => @reflection.options[:select],
        :conditions => conditions,
        :include => @reflection.options[:include],
        :readonly => @reflection.options[:readonly]
      ) if @owner[@reflection.primary_key_name]
    end

Я предполагаю, что вы используете "id" для первичного ключа, потому что он умирает в методе find, который вызывается рефлексивно. Конечно, этот метод принимает (* args), поэтому не стоит умирать от проблемы 2 к 1 ...

Итак, а) вы определили какой-то пользовательский искатель для этого класса (finder_sql?)

б) что это за метод full_xml? Это та часть, где вы звоните

 player_action.action_type.desc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...