Ruby 在 Rails 活动管理员 has_many 下拉列表中添加新对象
Ruby On Rails Active Admin has_many dropdown to add new object
我有一个模型通过另一个模型具有自引用 has_many 关系。
所以我有模型 Product
并且每个产品都可以有另一个产品。
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
在 Active Admin 中,我想在 create/edit 项目视图中删除或添加 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
添加新的 related_project 并按更新项目后,没有任何变化。
那么我应该怎么做才能解决这个问题?谢谢。
一个可能的解决方案是在项目上有一个抽象字段,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 数组来添加和删除关联项目。
所以,我自己解决了问题。由于 ProjectConnection 存储项目 {id,project_id,related_project_id} 之间的连接,因此使用 projects.project_connections
而不是 projects.related_projects
进行操作是正确的。首先,我在 admin/project.rb
:
中为 projects.project_connections
声明了一个参数结构
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
完美运行)
我有一个模型通过另一个模型具有自引用 has_many 关系。
所以我有模型 Product
并且每个产品都可以有另一个产品。
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
在 Active Admin 中,我想在 create/edit 项目视图中删除或添加 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
添加新的 related_project 并按更新项目后,没有任何变化。 那么我应该怎么做才能解决这个问题?谢谢。
一个可能的解决方案是在项目上有一个抽象字段,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 数组来添加和删除关联项目。
所以,我自己解决了问题。由于 ProjectConnection 存储项目 {id,project_id,related_project_id} 之间的连接,因此使用 projects.project_connections
而不是 projects.related_projects
进行操作是正确的。首先,我在 admin/project.rb
:
projects.project_connections
声明了一个参数结构
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
完美运行)