RoR: ActiveRecord, NoMethodError в моделях, которые расширены от AR - PullRequest
2 голосов
/ 27 апреля 2011

У меня установлены следующие модели: class Qa::Base < ActiveRecord::Base self.abstract_class = true Qa::Base.establish_connection("qa_audit_#{RAILS_ENV}") end</p> <p>class Qa::ErrorType < Qa::Base set_table_name "error_types"<br> # Associations has_many :errors, :class_name => 'Qa::Error' has_many :evaluations, :class_name => 'Qa::Evaluation', :through => :errors<br> # Validations validates_presence_of :content validates_uniqueness_of :content end

Но при сохранении / проверке модели я продолжаю нажимать следующие NoMethodErrors:

NoMethodError (undefined method `add_on_blank' for #Class:0x23a3020):

Например: e = Qa::ErrorType.first<br> e.valid?

1012 * производит *

<pre> NoMethodError: undefined method <code>add_on_blank' for #<Class:0x223eeb4> from /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:1994:in method_missing_without_paginate» из /opt/local/lib/ruby/gems/1.8/gems/will_paginate-2.3.14/lib/will_paginate/finder.rb:170:in method_missing' from /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:380:in отправить ' из /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:380:in method_missing_without_paginate' from /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2178:in with_scope ' из /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_proxy.rb:207:in send' from /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_proxy.rb:207:in with_scope ' из /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:376:in method_missing_without_paginate' from /opt/local/lib/ruby/gems/1.8/gems/will_paginate-2.3.14/lib/will_paginate/finder.rb:170:in method_missing ' из /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/validations.rb:599:in validates_presence_of' from /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.8/lib/active_support/callbacks.rb:182:in call ' из /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.8/lib/active_support/callbacks.rb:182:in evaluate_method' from /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.8/lib/active_support/callbacks.rb:166:in call ' из /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.8/lib/active_support/callbacks.rb:90:in run' from /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.8/lib/active_support/callbacks.rb:90:in каждый ' из /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.8/lib/active_support/callbacks.rb:90:in send' from /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.8/lib/active_support/callbacks.rb:90:in run ' из /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.8/lib/active_support/callbacks.rb:276:in run_callbacks' from /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/validations.rb:1110:in valid_without_callbacks? ' из /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/callbacks.rb:315:in `valid? '

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

Может кто-то пролить свет на то, что я делаю неправильно.

1 Ответ

4 голосов
/ 28 апреля 2011

Выяснил, в чем проблема:

class Qa::ErrorType < Qa::Base set_table_name "error_types"<br> # Associations has_many :errors, :class_name => 'Qa::Error' has_many :evaluations, :class_name => 'Qa::Evaluation', :through => :errors<br> # Validations validates_presence_of :content validates_uniqueness_of :content end

Это объявление переопределяет ассоциацию / объект ошибок, предоставляемый ActiveRecord, поэтому мы теряем все функции проверки, предоставляемые ActiveRecord :: Validations.Переименование ассоциации в более конкретную вещь решает проблему.

Правильная реализация класса:

class Qa::ErrorType < Qa::Base set_table_name "error_types"<br> # Associations has_many :transaction_errors, :class_name => 'Qa::TransactionError' has_many :evaluations, :class_name => 'Qa::Evaluation', :through => :transaction_errors<br> # Validations validates_presence_of :content validates_uniqueness_of :content end

Все проверки будут работать так, как они предназначены после этогоменять.Я думаю, что переименование класса Qa :: Error в Qa :: TransactionError не является обязательным.Я просто сделал это, чтобы мое соглашение об именах было единым для всего приложения.

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