Как решить ошибку «Объект не поддерживает #inspect»?

Я использую rails v3.2.2 и получаю странную ошибку, когда пытаюсь загрузить связанные записи.

Ниже приведен ввод/вывод терминала, который я получаю:

1.9.2-p318 :011 > Category.first
=> #<Category id: 1, ...>

1.9.2-p318 :013 > Category.first.articles
  Article Load (0.2ms)  SELECT `articles`.* FROM `articles` LIMIT 1
(Object doesn't support #inspect)

1.9.2-p318 :014 > Category.first.articles.first
  Category Load (0.2ms)  SELECT `categories`.* FROM `categories` LIMIT 1
NoMethodError: undefined method `scoped' for Category::Article:Module
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/associations/association.rb:123:in `target_scope'
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/associations/through_association.rb:15:in `target_scope'
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/associations/association.rb:87:in `scoped'
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/associations/collection_association.rb:569:in `first_or_last'
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/associations/collection_association.rb:101:in `first'
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/associations/collection_proxy.rb:46:in `first'
    from (irb):14
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/railties-3.2.2/lib/rails/commands/console.rb:47:in `start'
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/railties-3.2.2/lib/rails/commands/console.rb:8:in `start'
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/railties-3.2.2/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

В моей модели Category у меня есть:

class Category < ActiveRecord::Base
  has_many :article_relationships,
    :class_name  => 'Category::Article::ArticleRelationship',
    :foreign_key => 'category_id'

  has_many :articles,
    :through     => :article_relationships,
    :source      => :article
end

В моем Category::Article::ArticleRelationship у меня есть:

class Category::Article::ArticleRelationship < ActiveRecord::Base
  belongs_to :article,
    :class_name    => 'Article',
    :foreign_key   => 'article_id'
end

Как решить проблему, связанную с Object doesn't support #inspect?


Примечание. В той же модели Category у меня есть аналогичный оператор, как и для Category::Article::ArticleRelationship (он связан с классом User через класс Category::UserRelationship), и это не вызывает проблем.


person Backo    schedule 21.04.2012    source источник
comment
Вы require 'article' перед попыткой их осмотреть?   -  person sarnold    schedule 21.04.2012
comment
@sarnold - Нет, я совсем не require 'article'.   -  person Backo    schedule 21.04.2012


Ответы (3)


В вашем приложении есть две константы с именем Article. Один из них — ваш активный класс записи, константа верхнего уровня. Другой модуль Category::Article.

Когда вы выполняете belongs_to :article, может показаться, что rails начинает искать константу Article в классе, из которого вызывается created_to, поэтому он находит неправильную константу. Это вызывает все виды беспорядка, поскольку вы, очевидно, не можете использовать класс activerecord и модуль взаимозаменяемо.

Установка :class_name => '::Article' заставляет искать класс Article верхнего уровня.

person Frederick Cheung    schedule 21.04.2012
comment
Опасно ли указывать класс и модуль с одним и тем же именем? Если да, то что может быть лучше? - person Backo; 21.04.2012
comment
Во всяком случае, я только что понял, что у меня есть два класса (один из которых имеет пространство имен), которые могут соответствовать тому, что вы сказали: Category и Category::Article. - person Backo; 21.04.2012
comment
Не опасно, вам просто нужно иногда устранять неоднозначность. - person Frederick Cheung; 21.04.2012
comment
Я открыл связанный вопрос, так как у меня возникла проблема: stackoverflow.com/questions/10255587/ - person Backo; 21.04.2012

Если вы используете rails 4, проблема возникла из-за гема protected_attributes, вам нужно обновить версию гема 1.0.3 до 1.0.5, тогда он будет работать.

person user3136539    schedule 09.04.2014

Проблема, кажется, решена, указав следующее в моем Category::Article::ArticleRelationship:

class Category::Article::ArticleRelationship < ActiveRecord::Base
  belongs_to :article,
    :class_name    => '::Article', # note I added '::'
    :foreign_key   => 'article_id'
end

но я не понял почему?

person Community    schedule 21.04.2012