2017-06-02 3 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を削除または追加する/編集するプロジェクトビューを作成で欲しいです。 enter image description hereenter image description here

私は新しいRELATED_PROJECTとプレスの更新プロジェクトを追加した後

http://localhost:3000/admin/projects/1/edit

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 
admin/project.rbでは、何も変わりませんでした。 それを修正するにはどうすればよいですか?ありがとう。

答えて

0

私は自分で問題を解決しました。 ProjectConnectionは、プロジェクト{id、project_id、related_project_id}間の接続を保存するので、ではなくprojects.project_connectionsで操作するのが正しいでしょう。まず、私はadmin/project.rbprojects.project_connectionsのためのparamsの構造を宣言した。その後

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フィールドに関連付けられるべきプロジェクトIDの配列を送信して、関連するプロジェクトを追加および削除することができます。

関連する問題