我有一个看起来像这样的结构:
会议有一个about_module和一个speaker_module,具有多态关系
about_module和speaker_module都有多态关系的人
class Conference < ActiveRecord::Base
has_one :about_module, as: :resource, dependent: :destroy
accepts_nested_attributes_for :about_module
has_one :speaker_module, as: :resource, dependent: :destroy
accepts_nested_attributes_for :about_module
end
class AboutModule < ActiveRecord::Base
belongs_to :resource, polymorphic: true
has_many :people, as: :resource, dependent: :destroy
accepts_nested_attributes_for :people, allow_destroy: true
end
class SpeakerModule < ActiveRecord::Base
belongs_to :resource, polymorphic: true
has_many :people, as: :resource, dependent: :destroy
accepts_nested_attributes_for :people, allow_destroy: true
end
class Person < ActiveRecord::Base
default_scope { order(:position) }
belongs_to :resource, polymorphic: true
end
因此,当在PersonController中构建一个新人时,我现在需要在哪个模块上构建它。问题是我不知道如何访问父多态模型。
例如:
/管理/会议/:conference_id / speaker_module /人/新
/管理/会议/:conference_id / about_module /人/新
conference_id在param中传递,但我不知道它是哪个模块。
在PeopleController#new中,我想动态加载相应的模块,以便我可以调用
@person = module.people.build
当然我可以覆盖我的路由以包含模块的资源类型和ID,例如
/admin/conferences/:conference_id/:resource_type/:resource_id/people/new
但必须有更好的方法吗?
在路线中:
resources :conferences do
resource :about_module do
resources :people
end
resource :speaker_module do
resources :people
end
end