2017-06-02 69 views
0

我有一个与自引用has_many关系的模型,虽然是另一个模型。 所以我有型号Product和每个产品可以有另一种产品。Ruby On Rails Active Admin has_many下拉框添加新对象

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 

和我ProjectConnection型号:

class ProjectConnection < ActiveRecord::Base 
    belongs_to :project 
    belongs_to :related_project, class_name: Project 

    accepts_nested_attributes_for :project 
    accepts_nested_attributes_for :related_project 

    ... 
end 

在主动联系我想在创建/编辑项目视图中删除或添加related_project。 在admin/project.rb

form do |f| 
    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 
end 

http://localhost:3000/admin/projects/1/edit enter image description hereenter image description here

后,我添加新related_project并按更新项目,什么也没有改变。 那么我该怎么做才能解决这个问题?谢谢。

回答

0

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

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 

它完美)

1

一种可能的解决办法是对项目,connected_project_ids和before_save滤波器来持久的变化的抽象字段和负荷后填充字段用于初始化形式

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_ids字段中关联的项目标识符数组来添加和删除关联的项目。