如何使用 check_box_tag 在 Rails 中创建或销毁 has_many-trough 关联

How to use a check_box_tag to create or destroy a has_many-trough association in Rails

在我的 Rails 应用程序中,我有一个属于公司的活动。公司有很多组,其中一个或多个组可以通过名为 :general_connections.

的模型连接到活动中

对于此活动,我尝试显示关联公司的组列表(带有复选框)。通过选中一个框,应该创建一个 :general_connection 并且通过取消选中它,这个特定的 :general_connection 应该是 destroyed.

型号:

class Company < ActiveRecord::Base
  has_many :campaigns
  has_many :groups
end

class Campaign < ActiveRecord::Base
  belongs_to :company
  has_many :general_connections
  has_many :groups, through: :general_connections
end

class Group < ActiveRecord::Base
  belongs_to :company
  has_many :general_connections
  has_many :campaigns, through: :general_connections
end

class GeneralConnection < ActiveRecord::Base
  belongs_to :campaign
  belongs_to :group
  belongs_to :company
end

控制器:

#campaign_controller.rb /show
  def show
      @campaign = Campaign.find(params[:id])
    @company = Company.find(current_user.current_company)
    @main_groups = @company.groups
    @general_connections = @campaign.general_connections
    @groups = @campaign.groups
  end

#general_connection_controller.rb /connect_group_to_campaign
  def connect_group_to_campaign
    group = group.find(params[:group_id])
    @campaign = Campaign.find(params[:id])
    @campaign.general_connections.create(group: group)

    redirect_to :back
  end

#general_connection_controller.rb /disconnect_group_from_campaign
  def disconnect_group_from_campaign
    @general_connection = GeneralConnection.where("group_id = ? AND campaign_id = ?", params[:group_id], @campaign.id).first
    group = @general_connection.oneliner

    @general_connection.destroy

    redirect_to :back
  end

查看 form_tag:

        <h5>Groups for this campaign</h5>
        <div class="row">
            <% @main_groups.each do |group| %>
                <%= form_tag connect_group_to_campaign_path do |f| %>
                <%= hidden_field_tag 'campaign_id', @campaign.id %>
                  <%= f.check_box_tag group.id, group.id, true %>
                <% end %>

                <%= form_tag disconnect_group_from_campaign_path do |f| %>
                <%= hidden_field_tag 'campaign_id', @campaign.id %>
                  <%= f.check_box_tag group.id, group.id, false %>
                <% end %>

            <% end %>
        </div>

我认为我在 View 中的尝试可能是垃圾,但我只想自己先尝试一下。

我的问题是:

  1. 这可能吗?
  2. 如果是这样,我该如何撰写?

更新:
用@Jeff 的回答做了测试:

<%= form_for @campaign do |f| %>
<div class="form-group">
    <ul>
        <% @main_groups.each do |group| %>  
            <li>
            <%= check_box_tag :group_id, group.id, @campaign.general_connections.include?(group) %>
            <%= group.title %>
            </li>
        <% end %>
    </ul>   
</div>
<div class="actions">
    <%= f.submit "Save groups", class: "btn waves-effect waves-light" %>
</div>
<% end %>

但是没有 checkboxes 显示,我不确定这如何在我的 general_connections table.

中添加一行

我最近完成了一个与您描述的非常相似的功能。这里的代码对我来说是成功的,尽管它可能需要根据您的需要进行重大调整:

<%= form_for(@assignment) do |a| %>

  <%= a.label :name %>
  <%= a.text_field :name, class: 'form-control' %>

  <%= a.label :possible, "Points Possible" %>
  <%= a.text_field :possible, class: 'form-control' %>

  <%= a.label :priority %>
  <%= a.select(:priority, [0,1,2,3], :selected =>[2]) %>

  <% Assignment.each do |assignment| %>
     <%= check_box_tag :preassign_ids, assignment.id, 
          @assignment.preconditions.include?(assignment), :name => 'assignment[preassign_ids][]' %>
     <%= assignment.name %>
  <% end %>

  <%= a.submit "Submit", class: "btn btn-primary" %>
 <% end %>

这个例子使用了两个模型:第一个,"Assignments";其次,一个名为 "Preconditions" 的连接模型创建分配之间的关系。 Preconditions table 包括两列:"mainassign" 和 "preassign." 所以这就是 :preassign_ids 发挥作用的地方。您需要对应用中的关联做一些类似的工作。

在此代码中,单击复选框创建一个将当前分配链接到另一个分配的先决条件。我还没有测试过取消选中复选框是否会破坏关系,但第一部分工作正常。

我自己也是新手,所以我不知道我的其他文件中的代码是否有帮助。如果您认为这种方法正是您所需要的,我很乐意 post。