1

我想保存不同的結果(默認和手動),每個結果都可能有一個原因。認爲這將是一個多態關聯的好地方。然而,這些模型是命名空間的,並且這比預期的更易於使用。以下the guideRails與名稱空間的多態關聯

應用程序/模型/事件/ reason.rb

# id    :integer   not null, primary key 
# reasons   :string 
# reasonable_id :integer 
# reasonable_type :string 
# created_at  :datetime   not null 
# updated_at  :datetime   not null 
# 

class Event::Reason < ActiveRecord::Base 
    belongs_to :reasonable, polymorphic: true 
end 

應用程序/模型/事件/ result.rb

class Event::Result < ActiveRecord::Base 
    belongs_to :event 
    has_one :event_reason, as: :reasonable 
end 

應用程序/模型/事件/ manual_result .rb

class Event::ManualResult < ActiveRecord::Base 
    belongs_to :event 
    has_one :event_reason, as: :reasonable 
end 

但如果我嘗試做這樣的事情:

Event::ManualResult.last.event_reason 
    Event::ManualResult Load (5.1ms) SELECT "event_manual_results".* FROM "event_manual_results" ORDER BY "event_manual_results"."id" DESC LIMIT 1 
    NameError: uninitialized constant Event::ManualResult::EventReason 

Event::Result.last.event_reason 
    Event::Result Load (0.4ms) SELECT "event_results".* FROM "event_results" ORDER BY "event_results"."id" DESC LIMIT 1 
    NameError: uninitialized constant Event::Result::EventReason 

這似乎是期待協會嵌套產生額外層Event::ManualResult::EventReasonEvent::Result::EventReason

回答

5

你剛纔內需要在關聯中指定class_name:

class Event::Result < ActiveRecord::Base 
    belongs_to :event 
    has_one :event_reason, as: :reasonable, class_name: 'Event::Reason' 
end 

這樣你就不會允許rails從.event_reason(它在這種類型的情況下無法做到)嘗試猜測類。

+0

謝謝了!男人,我從字面上做同樣的事情!蜂巢五。什麼是心靈扭曲 – TheLegend