[英]update join table has_many through with additional checkboxes
if i dont find solution here i have no idea where i should looking for... 如果我在这里找不到解决方案,我不知道该在哪里寻找...
I know there is right, easy solution for it...but something i just dont understand. 我知道有正确,简单的解决方案...但是我只是不明白。
I have 3 models... 我有3个模特...
Scheme.rb Scheme.rb
class Scheme < ActiveRecord::Base
has_many :projects
has_many :custom_issue_field_definitions, through: :scheme_custom_issue_field_definitions
has_many :scheme_custom_issue_field_definitions
end
CustomIssueFieldDefinition.rb CustomIssueFieldDefinition.rb
class CustomIssueFieldDefinition < ActiveRecord::Base
has_many :schemes, through: :scheme_custom_issue_field_definitions
has_many :scheme_custom_issue_field_definitions
belongs_to :custom_issue_field
end
SchemeCustomIssueFieldDefinition.rb SchemeCustomIssueFieldDefinition.rb
class SchemeCustomIssueFieldDefinition < ActiveRecord::Base
belongs_to :scheme
belongs_to :custom_issue_field_definition
end
Join Model have 3 additional fields...with type: boolean. 联接模型还有3个其他字段...类型:布尔值。
Update: 更新:
In console i can update it like this: 在控制台中,我可以这样更新它:
a = Scheme.first
b = CustomIssueFieldDefinition.first
c = a.scheme_custom_issue_field_defintitions.find_or_create_by(custom_issue_field_definition: b)
c.update_attributes(visible: 1, reportable: 0, required: 0)
Next Update: 下次更新:
Now form looks like this (what is completely wrong): 现在表单看起来像这样(完全错误):
<%= simple_form_for @scheme_new_custom_issue_field, url: configurations_scheme_path(@scheme), method: :put do |f| %>
<% @available_custom_issue_field_definitions.each do |custom_issue_field| %>
<tr>
<td><%= custom_issue_field.label %></td>
<td><%= f.input :visible, as: :boolean %></td>
<td><%= f.input :reportable, as: :boolean %></td>
<td><%= f.input :required, as: :boolean %></td>
</tr>
<% end %>
<%= f.button :submit, class: "btn btn-primary" %>
<% end %>
and schemes_controller 和schemes_controller
def update
@scheme = Scheme.find(params[:id])
@scheme_new_custom_issue_field = @scheme.scheme_custom_issue_field_definitions.
find_or_create_by(scheme_id: @scheme, custom_issue_field_definition_id: params[:custom_issue_field_definition_id])
if @scheme_new_custom_issue_field.update_attributes(scheme_custom_issue_field_definition_params)
flash[:success] = "Scheme has been successfully updated"
redirect_to :back
else
render :edit
end
end
If you want to create new SchemCustomIssueFieldDefinition
record in the console, I suggest this alternative: 如果要在控制台中创建新的
SchemCustomIssueFieldDefinition
记录,建议使用以下替代方法:
a = Scheme.first
b = CustomIssueFieldDefinition.first
c = SchemeCustomIssueFieldDefinition.find_or_initialize_by(scheme: a, custom_issue_field_definition: b)
c.assign_attributes(visible: 1, reportable: 0, required: 0)
c.save
This will save you one less query than your current example code as this will not do have an UPDATE sql. 这将比当前示例代码少查询一个查询,因为它没有UPDATE sql。
For your form: 对于您的表格:
<%= simple_form_for @scheme, method: :patch do |f| %>
<% @available_custom_issue_field_definitions.each do |custom_issue_field| %>
<tr>
<%= f.simple_fields_for :scheme_custom_issue_field_definitions, @scheme.scheme_custom_issue_field_definitions.find_or_initialize_by(custom_issue_field_definition: custom_issue_field) do |ff| %>
<%= ff.hidden_field :id %>
<%= ff.hidden_field :scheme_id, value: @scheme.id %>
<%= ff.hidden_field :custom_issue_field_definition_id, value: custom_issue_field.id %>
<td><%= custom_issue_field.label %></td>
<td><%= ff.input :visible, as: :boolean %></td>
<td><%= ff.input :reportable, as: :boolean %></td>
<td><%= ff.input :required, as: :boolean %></td>
<% end %>
</tr>
<% end %>
<%= f.button :submit, class: "btn btn-primary" %>
<% end %>
schemes_controller.rb: schemes_controller.rb:
class SchemesController < ApplicationController
# ...
def update
@scheme = Scheme.find(params[:id])
if @scheme.update(scheme_params)
flash[:success] = "Scheme has been successfully updated"
redirect_to :back
else
render :edit
end
end
# ...
private
def scheme_params
# update below if you need other scheme attributes to be updated
params.require(:scheme).permit(:id, scheme_custom_issue_field_definitions_attributes: [:id, :scheme_id, :custom_issue_field_definition_id, :visible, :reportable, :required])
end
end
scheme.rb scheme.rb
class Scheme < ActiveRecord::Base
# ...
accepts_nested_attributes_for :scheme_custom_issue_field_definitions_attributes
# ...
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.