【问题标题】:Saving associated many to many relation in Rails在 Rails 中保存关联的多对多关系
【发布时间】:2018-01-09 04:04:24
【问题描述】:

我查看了相关帖子,但无法让我的代码正常工作。我有通过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. 当我保存一个新设备时,

    一个。 projects_devices 表只有 device_id 而不是 project_idproject_id 为空

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

  2. 编辑新设备时,

    一个。项目列表,所有项目列表为空。

    b.我看到项目显示了 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)

谁能帮我解决问题

【问题讨论】:

  • 我猜project_id 应该是project_ids(只是猜测)

标签: ruby ruby-on-rails-4 model


【解决方案1】:

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

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

【讨论】:

  • 不,它没有帮助:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多