ActiveRecord - неопределенный метод match - PullRequest
3 голосов
/ 27 июля 2011

Я пытаюсь закодировать простую иерархию в своих записях, но у меня странная ошибка.

require 'rubygems'
require 'active_record'

ActiveRecord::Base.establish_connection(
  :adapter => "sqlite3",
  :database => ":memory:"
)
ActiveRecord::Schema.define do
  create_table :foos do |t|
    t.string :name, :null => false
    t.integer :parent_id, :default => nil
  end
end

class Foo < ActiveRecord::Base
  belongs_to :parent, :class_name => Foo
end

bar = Foo.create( :name => 'Bar' )
p [ :bar, bar ]

baz = Foo.create( :name => 'Baz', :parent_id => bar.id )
p [ :baz, baz ]

quux = Foo.create( :name => 'Quux', :parent => bar )
p [ :quux, quux ]

Когда я запускаю ее, я получаю:

% ruby temp.rb
-- create_table(:foos)
   -> 0.0269s
[:bar, #<Foo id: 1, name: "Bar", parent_id: nil>]
[:baz, #<Foo id: 2, name: "Baz", parent_id: 1>]
/path/to/activerecord-3.0.9/lib/active_record/base.rb:1014:in `method_missing': undefined method `match' for Foo(id: integer, name: string, parent_id: integer):Class (NoMethodError)
        from /path/to/activerecord-3.0.9/lib/active_record/base.rb:1184:in `compute_type'
        from /path/to/activerecord-3.0.9/lib/active_record/reflection.rb:162:in `send'
        from /path/to/activerecord-3.0.9/lib/active_record/reflection.rb:162:in `klass'
        from /path/to/activerecord-3.0.9/lib/active_record/associations/association_proxy.rb:262:in `raise_on_type_mismatch'
        from /path/to/activerecord-3.0.9/lib/active_record/associations/belongs_to_association.rb:23:in `replace'
        from /path/to/activerecord-3.0.9/lib/active_record/associations.rb:1465:in `parent='
        from /path/to/activerecord-3.0.9/lib/active_record/base.rb:1564:in `send'
        from /path/to/activerecord-3.0.9/lib/active_record/base.rb:1564:in `attributes='
        from /path/to/activerecord-3.0.9/lib/active_record/base.rb:1560:in `each'
        from /path/to/activerecord-3.0.9/lib/active_record/base.rb:1560:in `attributes='
        from /path/to/activerecord-3.0.9/lib/active_record/base.rb:1412:in `initialize'
        from /path/to/activerecord-3.0.9/lib/active_record/base.rb:502:in `new'
        from /path/to/activerecord-3.0.9/lib/active_record/base.rb:502:in `create'
        from temp.rb:25

Если я добавлю has_many :children, :class_name => Foo, :as => :parent к определению Foo и вместо этого сделаю quux = bar.children.create(name => 'Quux'), я получу похожую ошибку.

Что я делаю не так?

1 Ответ

11 голосов
/ 27 июля 2011

Параметр :class_name для belongs_to ожидает строку, а не класс.

class Foo < ActiveRecord::Base
  belongs_to :parent, :class_name => "Foo"
end

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

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