Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails活动管理员有许多下拉菜单来添加新对象_Ruby On Rails_Ruby_Activeadmin - Fatal编程技术网

Ruby on rails RubyonRails活动管理员有许多下拉菜单来添加新对象

Ruby on rails RubyonRails活动管理员有许多下拉菜单来添加新对象,ruby-on-rails,ruby,activeadmin,Ruby On Rails,Ruby,Activeadmin,我有一个自指模型,它与另一个模型有很多关系。 所以我有模型产品,每个产品可以有另一个产品 class Project < ActiveRecord::Base has_many :project_connections has_many :related_projects, through: :project_connections, dependent: :destroy accepts_nested_attribu

我有一个自指模型,它与另一个模型有很多关系。 所以我有模型产品,每个产品可以有另一个产品

class Project < ActiveRecord::Base
  has_many :project_connections
  has_many :related_projects, through: :project_connections,
                              dependent: :destroy
  accepts_nested_attributes_for :project_connections,
                                :related_projects, allow_destroy: true

  ...
end
在活动管理中,我希望在“创建/编辑项目”视图中删除或添加相关的项目。 在admin/project.rb中

在我添加新的相关_项目并按Update项目后,没有任何更改。
那么我该怎么做才能解决这个问题呢?谢谢。

一个可能的解决方案是在项目上有一个抽象字段、连接的项目ID和一个保存更改前的过滤器,以及一个加载后的过滤器来填充字段以初始化表单

before_save   :connect_projects
after_find    :set_connected_project_ids
attr_accessor :connected_project_ids

def set_connected_project_ids
  self.connected_project_ids = connected_projects.pluck(:related_project_id)
end

def connect_projects
  connected_ids = connected_projects.pluck(:related_project_id)

  #projects that are in connected_project_ids, but not yet associated
  projects_to_connect = connected_project_ids - connected_ids
  projects_to_connect.each do |cp_id|
    connected_projects.create(related_project_id: cp_id) 
  end

  #projects that are associated, but not in connected_project_ids
  projects_to_disconnect = connected_ids - connected_project_ids
  projects_to_disconnect.each do |cp_id|
    connected_projects.where(related_project_id: cp_id).destroy_all
  connected_ids
end

这将允许您通过在connected_project_id字段中提交它现在应该关联的项目ID数组来添加和删除关联的项目。

所以,我自己解决了这个问题。由于ProjectConnection存储项目{id,project_id,related_project_id}之间的连接,因此使用projects.project_连接而不是projects.related_项目进行操作是正确的。首先,我在admin/project.rb中声明了projects.project_连接的参数结构:

而不是

inputs 'Продолжение проекта' do
  f.has_many :related_projects, heading: 'Добавьте проект', allow_destroy: true, new_record: true  do |i|
    i.input :id, as: :select, collection: Project.all, include_blank: false
  end
end
我写

inputs 'Продолжение проекта' do
  f.has_many :project_connections, heading: 'Добавьте проект', allow_destroy: true, new_record: true  do |i|
    i.input :related_project_id, as: :select, collection: Project.all, include_blank: false
    i.input :project_id, :input_html => { :value => f.object.id }, as: :hidden
  end
end
它工作得很好

project_connections_attributes: [
  :id,
  :project_id,
  :related_project_id,
  :_destroy
]
inputs 'Продолжение проекта' do
  f.has_many :related_projects, heading: 'Добавьте проект', allow_destroy: true, new_record: true  do |i|
    i.input :id, as: :select, collection: Project.all, include_blank: false
  end
end
inputs 'Продолжение проекта' do
  f.has_many :project_connections, heading: 'Добавьте проект', allow_destroy: true, new_record: true  do |i|
    i.input :related_project_id, as: :select, collection: Project.all, include_blank: false
    i.input :project_id, :input_html => { :value => f.object.id }, as: :hidden
  end
end