在 Rails 中保存关联的多对多关系



我查看了相关帖子,但无法让我的代码正常工作。我有通过桌子连接的设备和项目模型projects_devices。我的模型如下所示:

class Device < ActiveRecord::Base
has_many :projects, :through => :projects_devices
has_many :projects_devices 
accepts_nested_attributes_for :projects_devices, allow_destroy: true
end

class Project < ActiveRecord::Base
has_many :devices, :through => :projects_devices
has_many :projects_devices
accepts_nested_attributes_for :projects_devices
end

class ProjectsDevice < ActiveRecord::Base
belongs_to :device
belongs_to :project
end

我的设备控制器:

def new
@device = Device.new
project_device = @device.projects_devices.build
@projects = Project.all
end
def create
@device = Device.create(device_params)
end

和我的device_param:

def device_params
params.require(:device).permit(:name, :projects_devices_attributes => [:id , project_id: []])
end

我的观点:

<%= f.label :Projects_devices %><br>
<%= f.fields_for :projects_devices do |proj| %>
<%= proj.select(:project_id, [], {},  {class: "form-control projects-devices", multiple: "multiple" } ) do %>
<% if (@projects)  %>
<% for @project in @projects  %>
<%= content_tag(:option, @project.name, value: @project.id) %>
<% end %>
<% end %>
<% end %>
<% end %>

我在两个模型之间有很多对多的关联。在创建和编辑设备时,我应该能够列出所有可用的项目。并仅选择所需的那些。保存时,应更新projects_devices表。

我在这里有多个问题:

  1. 当我保存新设备时,

    A.projects_devices表只有device_id,没有project_idproject_id为空

    b. 如果有 2 个项目,而我只选择一个,即使这样,也会创建两个关联记录,只有device_id(如上所述,缺少project_id(。它应仅创建一个关联。

  2. 编辑新设备时,

    a. 项目列表,所有项目列表为空。

    二.我看到显示 2 个选择框而不是一个项目选择框(目前有 2 个项目(。

    c. 未更新设备。

我检查了参数:

"device"=>{"name"=>"ABC",
"projects_devices_attributes"=>{"0"=>{"project_id"=>["",
"298486374"]}}},
"commit"=>"Create Device"}

我的 rails 日志显示我的应用程序只插入device_id:

SQL (0.1ms)  INSERT INTO `projects_devices` (`device_id`) VALUES (980190994)

有人可以帮我找出问题吗

我不确定,但试试这个参数。 也许它有帮助。:)

def device_params
params.require(:device).permit(:name, :projects_devices_attributes =>[:id, :device_id, :project_id, :_destroy])
end

最新更新