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::EventReason и Event::Result::EventReason

ответ

5

Вы просто необходимо указать имя класса в ассоциации:

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

Таким образом, вы не позволяете рельсам попробовать и угадать класс для вас из .event_reason (который он не может сделать в этом случае).

+0

Спасибо, бутон! человек, я буквально делал то же самое! улей пять. Какая тварь ума – TheLegend