这是我的模型:

class Lesson < ActiveRecord::Base
  belongs_to :topic, :polymorphic => true
  validates_presence_of :topic_type, :topic_id
end

class Subject < ActiveRecord::Base
   has_many :lessons, :as => :topic
end

class Category < ActiveRecord::Base
  has_many :lessons, :as => :topic
end

现在,我需要的是一个允许用户创建或更新课程的表格。问题是,如何提供包含主题和类别混合的选择菜单? (对于用户而言,在此特定表单上,“主题”和“类别”是可以互换的,但在其他情况下并非如此。)

理想情况下,看起来应该像这样:

views / lessons / _form.html.haml
= simple_form_for(@lesson) do |f|
  = f.input :title
  = f.association :topic, :collection => (@subjects + @categories)

那将行不通,因为我们只需要指定topic_id,并且还需要topic_types。但是,我们如何指定这些值呢?

我想问题的症结在于,我确实想要一个选择菜单,该菜单指定与两个不同属性(topic_id和topic_type)相对应的两个值。有什么优雅的讽刺方法吗?

一些注意事项:

a)单表继承将使这个问题消失,但是我想避免这种情况,因为类别和主题具有它们自己的关系……我将为您省去细节。

b)我可以拉一些JavaScript恶作剧,是吗?但这听起来很混乱,而且如果有更清洁的方法来执行此操作,可以使用一些魔术形式的辅助工具或其他工具,那当然是更好的选择。

c)尽管我使用的是simple_form,但我不愿对此深感遗憾,以防万一,这使事情变得复杂。

谢谢

最佳答案

如果您不希望使用STI,则可以执行类似的操作:创建一个新的模型Topic(name:string),它将多态地引用SubjectCategory

class Lesson < ActiveRecord::Base
  belongs_to :topic
  validates_presence_of :topic_id
end

class Topic < ActiveRecord::Base
  belongs_to :topicable, :polymorphic => true
end

class Subject < ActiveRecord::Base
   has_one :topic, :as => :topicable
   has_many :lessons, :through => :topic
   accepts_nested_attributes_for :topic
end

class Category < ActiveRecord::Base
   has_one :topic, :as => :topicable
   has_many :lessons, :through => :topic
   accepts_nested_attributes_for :topic
end

在创建新的主题/类别的视图中:
<%= form_for @subject do |subject_form| %>
  <%= subject_form.fields_for :topic do |topic_fields| %>
    <%= topic_fields.text_field :name %>
  <% end %>
<% end %>

10-08 04:22