2010-12-16 5 views
2

У меня есть следующие 2 модели:Rails 3 полиморфная ассоциация поднимая NameError

class FuzzyDate < ActiveRecord::Base 
    belongs_to :fuzzy_dateable, :polymorphic => true 
end 

class Device < ActiveRecord::Base 
    has_one :received_date, :as => :fuzzy_dateable 
end 

со следующей схемой:

create_table "devices", :force => true do |t| 
    t.string "meid" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "fuzzy_dates", :force => true do |t| 
    t.date  "date" 
    t.integer "fuzz" 
    t.integer "fuzzy_dateable_id" 
    t.string "fuzzy_dateable_type" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

Давайте запустим консоль, мы должны?

>> d = Device.create(:meid => "A") 
=> #<Device id: 1, meid: "A", created_at: "2010-12-16 06:52:55", updated_at: "2010-12-16 06:52:55"> 
>> fd = FuzzyDate.create(:date => Date.today, :fuzz => 3) 
=> #<FuzzyDate id: 1, date: "2010-12-15", fuzz: 3, fuzzy_dateable_id: nil, fuzzy_dateable_type: nil, created_at: "2010-12-16 06:53:04", updated_at: "2010-12-16 06:53:04"> 
>> fd.fuzzy_dateable = d 
=> #<Device id: 1, meid: "A", created_at: "2010-12-16 06:52:55", updated_at: "2010-12-16 06:52:55"> 
>> fd 
=> #<FuzzyDate id: 1, date: "2010-12-15", fuzz: 3, fuzzy_dateable_id: 1, fuzzy_dateable_type: "Device", created_at: "2010-12-16 06:53:04", updated_at: "2010-12-16 06:53:04"> 

Хорошо, так хорошо. Перейдем от другого направления:

>> d.received_date 
NameError: uninitialized constant Device::ReceivedDate 
     from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.3/lib/active_record/base.rb:1199:in `compute_type' 
     from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.3/lib/active_record/reflection.rb:162:in `send' 
     from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.3/lib/active_record/reflection.rb:162:in `klass' 
     from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.3/lib/active_record/reflection.rb:198:in `quoted_table_name' 
     from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.3/lib/active_record/associations/has_one_association.rb:97:in `construct_sql' 
     from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.3/lib/active_record/associations/has_one_association.rb:7:in `initialize' 
     from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.3/lib/active_record/associations.rb:1450:in `new' 
     from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.3/lib/active_record/associations.rb:1450:in `received_date' 
     from (irb):5 
>> 

Doh! Я сделал кучу Googleing, и ответы, которые я нашел, - все это прямолинейно использует множественные имена моделей, чего здесь нет. Я провел пару вечеров, ударяющих головой об этом, так что любое руководство было бы очень благодарно.

ответ

7

Проблема заключается в том, что в вашей модели устройства вы называете ассоциацию: received_date, и по умолчанию будет искать модель ReceivedDate, если вы не сообщите об этом иначе.

Я бы сказал, что вы можете выбрать любое из этих решений.

No. 1

class Device < ActiveRecord::Base 
    has_one :received_date, :as => :fuzzy_dateable, :class_name => "FuzzyDate" 
end 

No. 2

class Device < ActiveRecord::Base 
    has_one :fuzzy_date, :as => :fuzzy_dateable 
end 
+0

Бинго! Вот и все. Спасибо за вашу помощь. – 2010-12-17 05:58:54

Смежные вопросы