Rails 3 и ar_extensions: неопределенный метод attribute_condition

Я продолжал получать эту ошибку в моем приложении Rails после обновления до Rails 3.

>> u.sent_messages
NoMethodError: undefined method `attribute_condition' for #Class:0x105523f18
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.4/lib/active_record/base.rb:1008:in `method_missing'
    from /Library/Ruby/Gems/1.8/gems/ar-extensions-0.9.2/lib/ar-extensions/finders.rb:79:in `sanitize_sql_from_hash'
    from /Library/Ruby/Gems/1.8/gems/ar-extensions-0.9.2/lib/ar-extensions/finders.rb:55:in `each_pair'
    from /Library/Ruby/Gems/1.8/gems/ar-extensions-0.9.2/lib/ar-extensions/finders.rb:55:in `sanitize_sql_from_hash'
    from /Library/Ruby/Gems/1.8/gems/ar-extensions-0.9.2/lib/ar-extensions/finders.rb:27:in `sanitize_sql'
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.4/lib/active_record/reflection.rb:131:in `send'
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.4/lib/active_record/reflection.rb:131:in `sanitized_conditions'
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.4/lib/active_record/associations/association_proxy.rb:105:in `conditions'
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.4/lib/active_record/associations/has_many_association.rb:103:in `construct_sql'
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.4/lib/active_record/associations/association_collection.rb:24:in `initialize'
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.4/lib/active_record/associations/has_many_association.rb:11:in `initialize'
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.4/lib/active_record/associations.rb:1492:in `new'
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.4/lib/active_record/associations.rb:1492:in `sent_messages'
    from (irb):36
    from /Library/Ruby/Gems/1.8/gems/activesupport-3.0.4/lib/active_support/callbacks.rb:488

Оказывается, я все еще использовал Gem ar_extensions из http://www.continuousthinking.com/tags/arext. С одной стороны, у них есть преемник, с другой - теперь в ActiveRecord есть опция массовой вставки, которую, возможно, стоит проверить (используя Model.create ([hash1, hash2, hash3, ...])).


person Jens    schedule 12.03.2011    source источник


Ответы (1)


ar-extension используется только в Rails 2.x. Для Rails 3.x вы должны использовать гем activerecord-import. Он имеет тот же API импорта.

https://github.com/zdennis/activerecord-import

person Zach Dennis    schedule 07.04.2011
comment
Верно, спасибо. Однако мне снова пришлось исправить PostgreSQL, чтобы разрешить массовый импорт (несколько строк в одном предложении INSERT). Поскольку я вставляю тысячи строк за один раз, это необходимо для повышения производительности. Есть ли конкретная причина, по которой это не по умолчанию? - person Jens; 07.04.2011
comment
Йенс, я не использую PostgreSQL, поэтому он использует резервный механизм отдельных операторов вставки. Я хотел бы просмотреть ваш патч, чтобы получить его в activerecord-import. - person Zach Dennis; 07.04.2011
comment
модуль ActiveRecord #: nodoc: module ConnectionAdapters #: nodoc: class PostgreSQLAdapter #: nodoc: def supports_import? истинный конец конец конец конец - person Jens; 09.04.2011
comment
Йенс, #supports_import? используется метод, поэтому вы можете использовать #import API. Если бы кто-то реализовал оптимизированную поддержку PostgreSQL, вам не пришлось бы менять свой код, это было бы просто быстрее. #supports_import? не имеет ничего общего с оптимизируемым адаптером базы данных, просто если он поддерживает API. - person Zach Dennis; 18.04.2011
comment
Это могло бы быть правдой, однако без этой строки Foo.import_without_validations_or_callbacks csv_array создаст тысячи отдельных операторов INSERT, а с этим оператором он создаст только несколько десятков (хотя и больших) операторов INSERT. - person Jens; 21.04.2011
comment
есть ли какой-нибудь альтернативный гем для предоставления _ne и подобных расширений символов в Rails 3 AR? - person New Alexandria; 04.01.2012
comment
Новая Александрия, насколько мне известно. - person Zach Dennis; 07.01.2012