2017-06-02 42 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字段中關聯的項目標識符數組來添加和刪除關聯的項目。