Ruby on rails Rails多态关联赢得';不保存类型

Ruby on rails Rails多态关联赢得';不保存类型,ruby-on-rails,polymorphic-associations,Ruby On Rails,Polymorphic Associations,我的项目中有几个模型:请求、工作、汽车和员工。工作是请求和Car/员工之间的中间模型 以下是协会: 请求 has_many :works, dependent: :destroy def performers works.map {|x| x.performer} end 工作 belongs_to :request belongs_to :performer, polymorphic: true 汽车 has_many :works, as: :performer has_many :

我的项目中有几个模型:请求、工作、汽车和员工。工作是请求和Car/员工之间的中间模型

以下是协会:

请求

has_many :works, dependent: :destroy
def performers
  works.map {|x| x.performer}
end
工作

belongs_to :request
belongs_to :performer, polymorphic: true
汽车

has_many :works, as: :performer
has_many :requests, through: :works, as: :performer
  def new
    @work = @request.works.new
  end

  def create
    @work = @request.works.new(work_params)
  end

  def work_params
      params.require(:work).permit(:performer_id, :request_id)
  end
员工

has_many :works, as: :performer
has_many :requests, through: :works, as: :performer
视图用于创建作品:

<%= form_for([@request, @work]) do |f| %>
    <%= (f.collection_select :performer_id, Employee.all, :id, :name) if @request.type == "StaffRequest" %>
    <%= (f.collection_select :performer_id, Car.all, :id, :select_info) if @request.type == "CarRequest" %>
    <%= f.submit 'OK' %>
<% end %>

问题是我的performer\u type列始终为空,它不保存类名。有什么问题吗?有什么想法吗?

它是空的,因为您没有通过它,您应该为表单添加一个隐藏字段:

<%= form_for([@request, @work]) do |f| %>
  <% if @request.type == "StaffRequest" %>
    <%= (f.hidden_field :performer_type, value: "Employee")  %>
    <%= (f.collection_select :performer_id, Employee.all, :id, :name)  %>
  <% elsif @request.type == "CarRequest" %>
    <%= (f.hidden_field :performer_type, value: "Car") %>
    <%= (f.collection_select :performer_id, Car.all, :id, :select_info) %>
  <% end %>
    <%= f.submit 'OK' %>
<% end %>

除了:performer\u id,您还必须传递:performer\u类型,一种方法是通过表单select\u标签:

def create 
  @work = @request.works.new(work_params)
end

def work_params
  # use :performer if you use :performer as in the select form field
  params.require(:work).permit(:performer, :request_id)

  # OR

  # use :performer_id & :performer_type if you also use the hidden field
  params.require(:work).permit(:performer_id, :performer_type, :request_id)
end
有一个很好的例子(对于Rails 4.2),它使用一个选择表单字段来表示多态性,因此您可以这样编写:

<%= f.grouped_collection_select :global_performer, [ Car, Employee ], :all, :model_name, :to_global_id, :name %>


您能否提供正在使用的代码,以便在
works
表中创建一行?例如,
Work.create
Employee.new(…).save
?在
中有许多:请求
为什么要添加
as::performer
?通过应该足够了。我一直认为多态关联类型是rails为您计算的