Rails 3多态关联引发NameError

Con*_*nia 2 ruby-on-rails polymorphic-associations

我有以下两种型号:

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

class Device < ActiveRecord::Base
  has_one :received_date, :as => :fuzzy_dateable
end
Run Code Online (Sandbox Code Playgroud)

使用以下架构:

  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
Run Code Online (Sandbox Code Playgroud)

让我们开启控制台,好吗?

>> 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">
Run Code Online (Sandbox Code Playgroud)

好的,到目前为止,这么好.让我们从另一个方向走:

>> 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
>> 
Run Code Online (Sandbox Code Playgroud)

卫生署!我已经完成了一堆谷歌,我找到的答案都是错误地使用多个模型名称,这不是这里的情况.我已经花了几个晚上来反对这个,所以任何指导都会非常感激.

Dan*_*nne 7

这里的问题是,在您的设备模型中,您将关联命名为:received_date,默认情况下将查找ReceivedDate模型,除非您另行说明.

我想你可以选择其中一种解决方案.

第1名

class Device < ActiveRecord::Base
  has_one :received_date, :as => :fuzzy_dateable, :class_name => "FuzzyDate"
end
Run Code Online (Sandbox Code Playgroud)

第2号

class Device < ActiveRecord::Base
  has_one :fuzzy_date, :as => :fuzzy_dateable
end
Run Code Online (Sandbox Code Playgroud)